非常类似于- 为表中的每个类别选择前 4 条记录,但没有可接受的答案,而且那里的一个答案没有多大意义,所以我再次询问。
我有一个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
Run Code Online (Sandbox Code Playgroud)
沿着这些思路的东西会起作用:
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)
它在类别中随机排序它们,然后将它们拉出,跟踪每个类别中的数量。
但不确定它的扩展效果如何。
编辑:尝试了几千条记录,看起来没问题。