2009-12-24 67 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