2010-08-12 53 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 

結果如下表:

 
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 

如果我按product_number,color_number我得到ID 和371
但我想要得到編號和371,因爲我想在按照size_position對它們進行分組之前先對結果進行排序。

我真的不知道如何做到這一點?!?

有人可以幫我嗎?

謝謝!

+0

你能解釋一下結果應該是什麼樣子嗎? – Kwebble 2010-08-12 11:58:35

+0

謝謝大家,我用php循環訪問'未分組'數據解決了這個問題。這是真正的禁食方式。再次感謝! – Johan 2010-08-16 12:27:04

回答

0

嘗試通過兩列命令:

... ORDER BY product.id, size_position ASC 

它將由ID排序第一,但隨後被size_position。

+0

不完全是我想要的,但謝謝! – Johan 2010-08-12 11:17:56

2

這是在分組查詢中使用非分組列的問題。一般來說,這是應該避免的。有些數據庫引擎會阻止你這樣做,因爲它沒有邏輯意義 - 如果我想要一個組的product.id,但是哪一個數據庫引擎應該選擇,因爲對於一個組有多個選項?

ORDER BY僅用於使用GROUP BY時的聚合或分組列,但我不確定您是否可以輕鬆進行聚合。您正在爲組中的MIN(size_position)行尋找product.id。我認爲爲每個組分隔這一行的子查詢可能是唯一的方法;我想不出一個簡單的辦法來解決這個問題。

編輯

我在這些情況下的本能總是做這兩個步驟。我不喜歡嵌套子查詢的巨大查詢,因爲我發現它們不可讀。你對規範化的模式有很長的查詢,所以我不打算試圖在這裏分解查詢,我很可能犯了一個錯誤。

查詢1會將product_number,color_number和MIN(size_position)(按product_number,color_number分組)放入臨時表中。

查詢2然後將檢索temp_table中每個product_number,color_number,size_position的product_id。這樣你可以直接對最小尺寸的位置進行連接。

使用臨時表的負面表現在許多情況下都是過度使用(並非所有情況,但對於我在過去10年中在交易應用程序中進行的查詢中的99%來說)。

還有一種涉及子查詢自連接的可能性,但是模式如此嚴格的標準化,我認爲這不會特別有利於實現。

+0

我想我知道你的意思,謝謝你的回覆。 – Johan 2010-08-12 11:20:38

1

如果按產品編號color_number進行分組,則爲列標識返回的值不確定(因爲它們對於每個產品編號,顏色編號對都不相同)。有關詳細說明,請參閱here

所以,你說「我想在分組之前對結果進行排序」,你能說出爲什麼要分組嗎?究竟你想從中得到什麼。

EDIT:

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 2010-08-12 11:16:57