2009-12-24 30 views
1

我想選擇不同的product_series,但我也想要所有其他列。MySQL:選擇不同的字段,但獲取其餘列?

這是我的查詢,因爲它代表:

SELECT DISTINCT product_series 
FROM cart_product 
WHERE product_brand = "everlon" 
AND product_type = "ring" 
AND product_available = "yes" 

這只是給了我product_series,我需要的所有其他列該行也。如果我嘗試不僅僅選擇product_series,我最終會獲得多個產品系列。

我想要的是*所有的領域,但我想限制它,所以我只得到每行產品1行。

我不知道如果我解釋這個正確的,所以讓我舉一個例子:

,如果我有

product_series product_id 
---------------------------- 
"seriesA"  230 
"seriesA"  231 
"seriesB"  232 
"seriesB"  233 

我會得到所有的列,但只有1%product_series:

product_series product_id 
---------------------------- 
"seriesA"  230 
"seriesB"  232 

我該怎麼做?

回答

4
SELECT pi.* 
FROM (
     SELECT DISTINCT product_series 
     FROM cart_product 
     ) pd 
JOIN cart_product pi 
ON  pi.id = 
     (
     SELECT id 
     FROM cart_product po 
     WHERE product_brand = "everlon" 
       AND product_type = "ring" 
       AND product_available = "yes" 
       AND po.product_series = pd.product_series 
     LIMIT 1 
     ) 

這將選擇每個系列的一個產品沒有特別的順序。

ORDER BY條件添加到子查詢中以定義順序。

您可能還需要閱讀這篇文章在我的博客:

+0

+1很好的答案! – James 2009-12-24 18:08:38

+0

謝謝,我最終需要它也是價格最低的那個,所以我可以展示每個系列的價格,所以能夠訂購是很好的謝謝。 – 2009-12-24 18:50:14

1

聽起來像你想GROUP BY代替。

+0

謝謝你,改變了我的選擇*,然後在最後product_series添加組。這似乎已經成功了。謝謝!和聖誕快樂! – 2009-12-24 17:51:58

+0

也祝你聖誕快樂,伊薩克先生!這裏的工作很棒。 – Sampson 2009-12-24 17:53:30

+0

請注意,具有隱藏列的「GROUP BY」返回的結果屬於同一行的事實不能保證。目前的實施情況如此,但將來可能會改變。 – Quassnoi 2009-12-24 18:01:24

3

您可以使用GROUP BY來做到這一點。但請注意,必須有某種方法可以將多個product_id的組「扁平化」爲一個單一值。這是用聚合函數來實現,如MIN,MAX,或GROUP_CONCAT():

SELECT product_series, MAX(product_id) max_product_id 
FROM cart_product 
WHERE product_brand = 'everlon' 
AND product_type = 'ring' 
AND product_available = 'yes' 
GROUP BY product_series 

BTW:請不要使用雙引號的SQL來界定字符串。在所有RDBMS-es但MySQL中,雙引號可用於分隔標識符,並且只有單引號可用於分隔字符串文字。

+0

示例輸出列出了最小的product_id,而不是最大的 – 2009-12-24 18:30:16

+0

+1。不是問題的理想解決方案,而是如何使用GROUP BY的一個很好的表達方式。 – James 2009-12-24 18:44:23

+0

@OMG小馬:或許,但是OP從未說過他們關心他們想看哪種產品。對我而言,在文中提到MIN似乎足以開始思考你真正想要的東西。 – 2009-12-25 20:42:20