2013-01-09 14 views
6

からランダムに一つのレコード私はこのような何かに見えるItemsテーブルを持つデータベースがあります。MYSQLを選択し、各カテゴリー

id 
name 
category (int) 

100いくつかのレコードがありますが。各itemcategoriesテーブルに対応する7つの異なるcategoriesのいずれかであり得る:

id 
category 

Iは各カテゴリから、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でクエリをラップ、1に各カテゴリを制限するには、次のクエリは、両方のGROUP BYORDER 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 

注意を。これが私が2つのクエリを使用した理由です:最初のものは結果をソートし、2つ目は結果をグループ化します。

私はこのクエリがどのレースにも勝つつもりはないことを理解します。私は提案に開放されています。

+0

上記のクエリは後に動作しますいくつかの訂正: 'SELECT * FROM( SELECT cidをcid、c.category、i.id、iとします。ShuffeledItems GROUP BY ShuffeledItems.cid' – rzymek

+0

フムなどの項目RAND() )ことにより、I ON c.id = i.category ORDERのJOIN INNER Cカテゴリ に名前を付け、この改訂されたクエリは、私 – djt

+0

1500行程度戻っています@ SalmanAええ、私は何を言うべきか分からない。私はそれを私のDB上で試しています。それは約1500行を返していて、7ではなくです。 – djt

0

注意:次の例では、他のテーブルの名前が「カテゴリ」(2番目のテーブル名は大文字ではない)と指定されているため、テーブルの名前が「アイテム」ではなく「アイテム」であると仮定しています。

あなたが何をしたいのための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

このクエリを使用してください。 LIMIT 1なし - 各カテゴリのすべてのアイテム... – rzymek

+0

@ryzmek、はい、それは正しいです。これはまた、OPが偶然に求めたものです。 "各カテゴリから1つのランダムな項目を選択するクエリが必要です" –

+0

私の意見では、著者は、7つの行と各カテゴリの1つのrand項目を返すクエリを期待しています。 – 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 

このクエリは1行しか返し

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

'items'テーブルへの参照がないので、' categories'テーブル – djt

+0

@dtjは私のクエリにキーワード項目を持っていません。何があなたを混乱させていますか?私はあなたにそれを後に自分自身で解決することができる例を示しました。 –

+0

あなたは 'GROUP BY'と' RAND() 'が一緒に動いて各グループにランダムを与えてくれるのでしょうか?私はそれを疑う原因になります。 – Sharky

関連する問題