随机记录我有一个Items
表的数据库,看起来是这样的:MYSQL选择从每个类别
id
name
category (int)
有几十万条记录。每个item
可以是一个的7种不同的categories
,其对应于一个categories
表中:
id
category
我想要选择1个随机项目,从每个类别的查询。接近这个最好的方法是什么?我知道使用Order By rand()
和LIMIT 1
进行类似的随机查询,但我从来没有这样做过。
随机记录我有一个Items
表的数据库,看起来是这样的:MYSQL选择从每个类别
id
name
category (int)
有几十万条记录。每个item
可以是一个的7种不同的categories
,其对应于一个categories
表中:
id
category
我想要选择1个随机项目,从每个类别的查询。接近这个最好的方法是什么?我知道使用Order By rand()
和LIMIT 1
进行类似的随机查询,但我从来没有这样做过。
此查询返回的所有项目按随机顺序加入到类别:
SELECT
c.id AS cid, c.category, i.id AS iid, i.name
FROM categories c
INNER JOIN items i ON c.id = i.category
ORDER BY RAND()
要限制每个类别之一,在一个局部GROUP BY
包裹查询:
SELECT * FROM (
SELECT
c.id AS cid, c.category, i.id AS iid, i.name
FROM categories c
INNER JOIN items i ON c.id = i.category
ORDER BY RAND()
) AS shuffled_items
GROUP BY cid
注意,当查询有两个GROUP BY
和ORDER BY
子句,分组排序之前进行。这就是为什么我使用了两个查询:第一个对结果进行排序,第二个对结果进行分组。
我知道这个查询不会赢得任何比赛。我乐于接受建议。
请注意:在下面的示例中,我假设您的表名为“items”而不是“Items”,因为您也表示另一个表名为“categories”(第二个表名不是大写字母)。
你想做的事就大致是怎样的SQL:
`SELECT items.id AS item_id,
items.name AS item_name,
items.category AS item_category_id,
categories.id AS category_id,
categories.category AS category_name
FROM items, category
WHERE items.category = categories.id
ORDER BY rand()
LIMIT 1`
试试这个
SELECT id, name, category from Items where
(
select count(*) from Items i where i.category = Items.category
GROUP BY i.category ORDER BY rand()
) <= 1
REF:http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/
这是一个简单的解决方案。假设你有这张桌子。
id name category
1 A 1
2 B 1
3 C 1
4 D 2
5 E 2
6 F 2
7 G 3
8 H 3
9 I 3
使用此查询
select
c.id,
c.category,
(select name from category where category = c.category group by id order by rand() limit 1) as CatName
from category as c
group by category
上面的查询工作后的错误几个更正: 'SELECT * FROM( SELECT c.id as cid,c.category,i.id,i。命名 从C类 INNER JOIN AS ShuffeledItems 组项目I ON c.id = i.category ORDER BY RAND() )的ShuffeledItems.cid' – rzymek
嗯,这个修改后的查询返回约1500行对我来说 – djt
@萨尔曼是啊,我不知道该说什么。我想它在我的DB和它返回约1500行,而不是7 – djt