2017-10-31 1 views
3

id 가격 카테고리 등이있는 제품이있는 테이블이 있습니다 ... 가장 최근의 item_category에서 하나의 항목을 추출하려고합니다. 자신의 카테고리). 어떤 여기 MySQL ORDER BY와 GROUP BY를 함께 사용합니다.

는 6 개 범주에서 저 6 개 항목을 얻는다, 코드입니다하지만 그들은 ID로

SELECT * from items WHERE item_category = '2' or item_category = '4' or 
item_category = '12' or item_category = '13' or item_category = '14' or 
item_category = '19' GROUP BY `item_category` ORDER BY `item_id` LIMIT 6 

주문은 6 개 항목, 그리고 반환 된 배열에서 실행되는 (가장 작은 ID로) 가장 오래된이다 원래 테이블에.

대신 최신 항목을 exctract 할 수 있습니까?

최고의 쿼리

는 내가 모든

select * 
from items 
where item_category in ("2","4","12","13","14","19") 
group by item_category 
order by item_category DESC 
+0

가 왜'GROUP BY'를 사용할 수 있습니까? –

+0

당신의 쿼리는 다음과 같을 수 있습니다 'SELECT * FROM items where item_category IN ('2', '4', '12', '13', '14', '19 ') ORDER BY item_id DESC LIMIT 6' where 하위 항목 순서로'item_id'에 의해 행을 정렬하는'ORDER BY item_id DESC' 표현식 –

+1

ONLY_FULL_GROUP_BY가 비활성화되면, GROUP BY의 표준 SQL 사용에 대한 MySQL 확장은 선택 목록, HAVING 조건 또는 ORDER BY 목록이 비 집합 열이 기능적으로 GROUP BY 열에 종속되지 않은 경우에도 열을 반환합니다. 이로 인해 MySQL은 앞의 쿼리를 받아들입니다. 이 경우 서버는 각 그룹에서 임의의 값을 자유롭게 선택할 수 있으므로 동일하지 않으면 선택한 값이 불확실합니다. 이는 원하는 것이 아닐 수 있습니다. 또한 각 그룹의 값 선택에는 ORDER BY 절 –

답변

4

먼저 그냥 지적하는 생각, 당신은 그룹의 모든 비 집계 열을 포함하고자하지 않는 경우로 그룹을 사용하지 않도록 자신을 훈련해야한다. 예 :

SELECT col1,col2 FROM table GROUP BY col1 -- BAD 
SELECT col1,col2 FROM table GROUP BY col1,col2 -- GOOD 
SELECT col1,MAX(col2) FROM table GROUP BY col1 -- GOOD 

이 때문에 당신이 모든 문제의 근원 그룹 내에서 고유하지 않은 열에서 임의의 예측할 수없는 가치를 얻을 명백한 문제입니다.

는이 작업을 수행해야했다 가졌 : 만 6 개 그룹을 가질 수 있고, 순서에 따라 더 이상 아무것도하지 않기 때문에 제한 할 필요가 없습니다

SELECT item_category, MAX(item_id) 
FROM items 
WHERE item_category IN ('2','4','12','13','14','19') GROUP BY `item_category` 

하는 것으로. 다음 당신이 할 수있는 해당 항목 행을 얻고 싶은 경우에

다음

SELECT * 
FROM items 
WHERE item_id IN ( 
    SELECT MAX(item_id) 
    FROM items 
    WHERE item_category IN ('2','4','12','13','14','19') 
    GROUP BY item_category 
); 

를 다음도 작동 할 수 있습니다 :

SELECT * 
FROM items i JOIN (
     SELECT i2.item_category, MAX(i2.item_id) as max_item_id 
     FROM items i2 
     WHERE i2.item_category IN ('2','4','12','13','14','19') GROUP BY 
     i2.`item_category` 
) max_ids ON i.item_id=max_ids.max_item_id; 
+0

코드와 시간을 보내 주셔서 감사합니다 !! 궁극적 인 최종 해결책은 첫 번째 SELECT에 *를 추가하고 모든 항목에 대해 모든 열을 반환하는 것이 었습니다. SELECT *, item_category, MAX (item_id) 상품에서 어디에서 item_category IN ('2', '4', '12', '13', '14', '19') GROUP BY'item_category' –

+0

그렇게 할 때 매우주의해야합니다. '*'의 일부로 반환 된 열이 'MAX (item_id)'와 일치한다는 것을 확신 할 수 없다. – apokryfos

+0

그래, 그렇지 않았다. 그래서 실제 최종 질의는 -SELECT * from items WHERE ( SELECT MAX (ITEM_ID) item_category은 IN ('2', '4', '12', '13', '14', '19') 군은 BY ' 을 item_category' 항목 FROM ) –

관련 문제