7

Items次のようなテーブルを持つデータベースがあります。

id
name
category (int)

数十万件のレコードがあります。それぞれが、テーブルに対応するitem7 つの異なる のいずれかになります。categoriescategories

id
category

各カテゴリから 1 つのランダムなアイテムを選択するクエリが必要です。それに近づく最良の方法は何ですか?同様のランダムクエリにOrder By rand()andを使用することは知っていますが、このようなことをしたことはありません。LIMIT 1

4

5 に答える 5

6

このクエリは、カテゴリに結合されたすべてのアイテムをランダムな順序で返します。

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()

各カテゴリを 1 つに制限するには、クエリを部分的 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 BYandORDER BY節の両方がある場合、グループ化は並べ替えの前に実行されることに注意してください。これが、2 つのクエリを使用した理由です。1 つ目は結果を並べ替え、2 つ目は結果をグループ化します。

このクエリが競争に勝てないことは理解しています。私は提案を受け入れます。

于 2013-01-09T20:04:10.777 に答える
0

これを試して

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

参照: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

于 2013-01-09T20:00:50.963 に答える
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
于 2013-01-09T20:18:54.653 に答える
0

最終的な選択の前に、元のテーブルの順序を変更します (ランダムな順序):

select * from 
  (select category, id, name from categories order by rand()) as tab 
  group by 1
于 2021-01-16T14:09:54.800 に答える
-1

注:次の例では、テーブルの名前が「Items」ではなく「items」であると想定しています。これは、他のテーブルの名前が「categories」であるとも述べているためです(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`
于 2013-01-09T20:00:12.727 に答える