2010-08-12 5 views
4

그룹화하기 전에 결과를 정렬하려고하지만 완료하지 못했습니다.MySQl GROUP BY 및 ORDER BY가 원하는 것을 수행하지 않음

 
SELECT DISTINCT 
product.id, 
product_number_value.att_value AS product_number, 
color_number_value.option_code AS color_number, 
size_value.option_code AS size_code, 
size_value.option_position AS size_position 
FROM 
product 
INNER JOIN product_attribute_relational AS product_number_relational ON product_number_relational.product_id = product.id 
INNER JOIN product_att_varchar AS product_number_value ON product_number_relational.product_att_id = product_number_value.product_att_id 
INNER JOIN product_attribute_relational AS color_number_relational ON color_number_relational.product_id = product.id 
INNER JOIN product_att_select AS color_number_select ON color_number_relational.product_att_id = color_number_select.product_att_id 
INNER JOIN attribute_option_value AS color_number_value ON color_number_select.att_value = color_number_value.option_id 
INNER JOIN product_attribute_relational AS size_relational ON product.id = size_relational.product_id 
INNER JOIN product_att_select AS size_select ON size_relational.product_att_id = size_select.product_att_id 
INNER JOIN attribute_option_value AS size_value ON size_select.att_value = size_value.option_id 
WHERE 
product_number_relational.att_id = 1 AND 
color_number_relational.att_id = 2 AND 
size_relational.att_id = 3 AND 
product.id IN (365, 366, 367, 368, 369, 371, 372, 373, 374) 
ORDER BY 
product.id ASC 

결과는 다음 표입니다 :

나는이 쿼리가 product_number에 의해

 
id product_number color_number size_code size_position 
365 F23740 311 S 24 
366 F23740 311 M 25 
367 F23740 311 L 26 
368 F23740 311 XL 27 
369 F23740 311 XS 23 
371 F23745 213 S 24 
372 F23745 213 M 25 
373 F23745 213 L 26 
374 F23745 213 XL 27 

만약 I 그룹, color_number 내가 얻을 ID를 365 및 371
하지만 ID 및 371을 가져 오려면 그룹화하기 전에 결과를 size_position에 의해 첫 번째 순서대로 지정해야하기 때문입니다.

이 작업을 수행하는 방법에 대해 정말로 알지 못합니까?! ??

누군가 나를 도와 드릴까요 ??

감사합니다. 그것은 첫째 ID로 정렬합니다

... ORDER BY product.id, size_position ASC 

, 그러나 size_position 기준 :

+0

결과가 어떻게 나타나는지 설명 할 수 있습니까? – Kwebble

+0

모두 감사합니다, 나는 '그룹화되지 않은'데이터를 통해 PHP 루핑으로 해결했습니다. 그것은 정말로 금식의 길이었다. 다시 한 번 감사드립니다! – Johan

답변

0

은 모두 열을 기준으로 주문하십시오.

+0

정확히 원하는 것은 아니지만 감사합니다! – Johan

2

그룹화 된 쿼리에서 그룹화되지 않은 열을 사용하면 문제가 발생합니다. 일반적으로 피하는 것이 좋습니다. 논리적으로 이해하지 못하기 때문에 일부 DB 엔진은이 작업을 수행하지 못하게합니다. 그룹에 대해 product.id를 원하지만 단일 그룹에 대해 여러 옵션이 있기 때문에 어떤 DB 엔진을 선택해야합니까?

ORDER BY는 GROUP BY를 사용할 때 집계 또는 그룹화 된 열에 대해서만 작동하도록되어 있지만 쉽게 집계 할 수 있는지는 잘 모르겠습니다. 그룹 내에서 MIN (size_position)이있는 행에 대해 product.id를 찾고 있습니다. 각 그룹에 대해이 행을 분리하는 하위 쿼리가 유일한 방법 일 수 있다고 생각합니다. 나는 이것을 꺼내기위한 나의 머리 꼭대기에서 쉬운 길을 생각할 수 없다. 이러한 경우

편집

내 본능은 두 단계에서이 작업을 수행하는 것이있다. 중첩 된 서브 쿼리를 사용하여 커다란 엉덩이 질의를하는 재미가 없습니다. 단순히 읽을 수 없기 때문입니다. 정규화 된 스키마에 대한 쿼리가 너무 길어서 여기에 쿼리를 세분화하지 않으려 고합니다. 실수 할 가능성이 큽니다.

쿼리 1은 product_number, color_number 및 MIN (size_position) (product_number, color_number로 그룹화)을 임시 테이블로 푸시합니다.

쿼리 2는 temp 테이블의 각 product_number, color_number, size_position에 대한 product_id를 검색합니다. 이렇게하면 최소 크기 위치에 대해 직접 조인을 수행 할 수 있습니다.

임시 테이블을 사용하는 부정적인 성능은 많은 경우에 과장되었습니다 (전부는 아니지만 지난 10 년 동안 트레이딩 응용 프로그램에서 수행 한 쿼리의 99 %는 확실합니다).

하위 쿼리 자체 조인과 관련된 또 다른 가능성이 있지만 스키마가 너무 많이 정규화되어 있으므로 구현하는 것이 특히 바람직하지 않다고 생각합니다.

+0

귀하의 회신에 감사드립니다. – Johan

1

product_number, color_number를 기준으로 그룹화하면 열 id에 대해 반환 된 값이 불확실합니다 (product_number, color_number 쌍마다 동일하지 않기 때문에). 자세한 설명은 here을 참조하십시오.

그래서 "그룹화하기 전에 내 결과를 정렬하고 싶습니다."라고 말하면 그룹화 이유를 말할 수 있습니까? 정확히 무엇을 얻고 싶습니까?

편집 :

SELECT DISTINCT 

product_number_value.att_value AS product_number, 
color_number_value.option_code AS color_number, 
min(size_value.option_position) AS sizePosition 
from ... 

group by product_number, color_number order by sizePosition 

당신은 product_number있을 것이다 아닌 ID : 주석 후.

+0

동일한 product_number 및 color_number가있는 제품을 가져오고 싶지만 이러한 조합의 크기가 여러이기 때문에 가장 작은 크기의 조합 만 필요합니다. SORT BY로 수행 할 수 없기 때문에 정렬은 올바른 단어가 아닙니다. 알 겠어. – Johan