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

Chr*_*isR 4 php mysql

非常类似于- 为表中的每个类别选择前 4 条记录,但没有可接受的答案,而且那里的一个答案没有多大意义,所以我再次询问。

我有一个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
Run Code Online (Sandbox Code Playgroud)

Sim*_*mon 5

沿着这些思路的东西会起作用:

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;
Run Code Online (Sandbox Code Playgroud)

它在类别中随机排序它们,然后将它们拉出,跟踪每个类别中的数量。

但不确定它的扩展效果如何。

编辑:尝试了几千条记录,看起来没问题。