从MySQL中的每个类别中选择2种产品
问题描述:
与MYSQL - select first 4 records for each category in a table非常相似,但没有一个可接受的答案,并且一个答案没有太大意义,所以我再次提问。从MySQL中的每个类别中选择2种产品
我有一个PRODUCTS
表3列:ID
,NAME
和CATEGORY
现在,我想知道的是,如果它是在所有可能的选择2个产品为每个不同的类别,而不在PHP循环做什么的查询。
所选产品的顺序并不重要,它们也可能是随机的。但重要的是,我只有每个类别最多2个产品。
所以一个好的结果集将
ID ; NAME ; CATEGORY
:::::::::::::::::::::::
152 ; APPLE ; FRUIT
185 ; ORANGE ; FRUIT
145 ; BEEF ; MEAT
141 ; PORK ; MEAT
410 ; PEPSI ; DRINKS
585 ; CARROT ; VEGETABLES
585 ; TOMATO ; VEGETABLES
答
东西沿着这些线路将工作:
SELECT id, name, category
FROM (
SELECT *,
IF(@prev <> category,
@rownum := 1,
@rownum := @rownum+1
) AS rank,
@prev := category,
@rownum
FROM (
SELECT * FROM products
ORDER BY category, rand()
) random_prodcts
) products_ranked
WHERE rank <= 2;
它随机预定他们的类别中,然后再换出来追踪有多少它从每个了。
不知道它会如何很好地扩展。
编辑:试了几千记录,它似乎确定。
+1
这工作很好。只要确保在运行查询之前设置变量即可。否则它将无法工作。 SET @ prev = 0,@ rownum = 0; – 2011-12-05 23:08:13
答
这应该做你在找什么。
SET @I=0;
SET @C='';
SELECT ID, Name, Category FROM (
SELECT B.*,
IF(@C != B.Category, @I:=1, @I:[email protected]+1) AS RowNum,
@C:=B.Category
FROM (
SELECT ID, Name, Category FROM Products GROUP BY Name, Category ORDER BY Category
) AS B HAVING RowNum <= 2
) AS A
答
完整的SQL:
SELECT t.id, t.name, t.category
FROM the_table AS t
, (SELECT MIN(id) AS id_min FROM the_table GROUP BY category) AS t1
, (SELECT MAX(id) AS id_max FROM the_table GROUP BY category) AS t2
WHERE (t.id=t1.id_min) OR (t.id=t2.id_max)
查询挑选分钟,每个类别的最高,并返回两者(或者只有一个,如果它是一样的)。
你说“所选产品的顺序不重要,它们可能是随机的”,所以这种方法应该没问题。
你的结果应该如何?把它放在你的代码中以更好地理解 – Omid 2011-04-12 10:50:15