从MySQL中的每个类别中选择2种产品

问题描述:

MYSQL - select first 4 records for each category in a table非常相似,但没有一个可接受的答案,并且一个答案没有太大意义,所以我再次提问。从MySQL中的每个类别中选择2种产品

我有一个PRODUCTS表3列:IDNAMECATEGORY 现在,我想知道的是,如果它是在所有可能的选择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 
+0

你的结果应该如何?把它放在你的代码中以更好地理解 – Omid 2011-04-12 10:50:15

东西沿着这些线路将工作:

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 
+0

谢谢,这似乎工作,但我似乎无法得到我的头在RowNum var ...当我选择它与ID,名称和类别列它有时还包含3而HAVING条款规定它不应该高于2? – ChrisR 2011-04-12 11:50:40

+0

这真的很奇怪 - 我只是试了一下,注意到它适用于 Simon 2011-04-12 12:10:35

+0

@ Simon143:是的,你的解决方案实际上给了我正确的rowNumbers ...谢谢! – ChrisR 2011-04-12 12:23:26

完整的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) 

查询挑选分钟,每个类别的最高,并返回两者(或者只有一个,如果它是一样的)。

你说“所选产品的顺序不重要,它们可能是随机的”,所以这种方法应该没问题。