我有一个数据库Items
表看起来是这样的:
id
name
category (int)
有几十万条记录。 每个item
可以在7个不同的一个categories
,其对应于一个categories
表中:
id
category
我想是选择1个随机项目,从每个类别查询。 什么是接近的最佳方式? 我知道使用Order By rand()
和LIMIT 1
类似的随机查询,但我从来没有做过这样的事情。
我有一个数据库Items
表看起来是这样的:
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
子句,分组排序前进行。 这就是为什么我用了两个疑问:第一个排序结果,第二个组的结果。
据我所知,这个查询是不会赢得任何比赛。 我愿意接受建议。
请注意:在下面的例子中,我假设你的表被命名为“物品”而不是“项目”,因为你也说其他的表被命名为“类”(第二个表名不是大写)。
你想要做的大概会是怎样的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`
这里有一个简单的解决方案。 让我们假设你有此表。
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 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/