2013-01-09 36 views
6

随机记录我有一个Items表的数据库,看起来是这样的:MYSQL选择从每个类别

id 
name 
category (int) 

有几十万条记录。每个item可以是一个的7种不同的categories,其对应于一个categories表中:

id 
category 

我想要选择1个随机项目,从每个类别的查询。接近这个最好的方法是什么?我知道使用Order By rand()LIMIT 1进行类似的随机查询,但我从来没有这样做过。

回答

5

此查询返回的所有项目按随机顺序加入到类别:

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 BYORDER BY子句,分组排序之前进行。这就是为什么我使用了两个查询:第一个对结果进行排序,第二个对结果进行分组。

我知道这个查询不会赢得任何比赛。我乐于接受建议。

+0

上面的查询工作后的错误几个更正: '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

+0

嗯,这个修改后的查询返回约1500行对我来说 – djt

+0

@萨尔曼是啊,我不知道该说什么。我想它在我的DB和它返回约1500行,而不是7 – djt

0

请注意:在下面的示例中,我假设您的表名为“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` 
+0

该查询返回只有一行。没有限制1 - 每个类别的所有项目... – rzymek

+0

@ryzmek,是的,这是正确的。巧合的是,这也是OP要求的。该任择议定书表示,我引用: “我要那个选择1个随机项目,从每个类别查询” –

+0

在我看来,笔者预计查询返回7行,为每个类别一个兰特项目。 – rzymek

0

这是一个简单的解决方案。假设你有这张桌子。

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

这一个IM有麻烦的感觉,因为似乎是到'items'表没有提到,只有'categories'表 – djt

+0

@dtj我没有在我的查询,然后关键词条目是什么困惑吗?我已经给你一个例子,你肯定可以在这之后制定出自己的想法。 –

+0

你确定了'GROUP BY'和'RAND()'将共同给予随机为每个组?因为我怀疑它。 – Sharky