2011-12-07 8 views
2

私は2つのテーブルを持っています。 'グループ'と '値'。SQLランダムな行を選択すると、ヘルプに参加します

SELECT * 
FROM groups as g 
inner JOIN 
(
SELECT * FROM values as v WHERE v.groupid = g.id ORDER BY RAND() LIMIT 1 
) AS rv ON rv.groupid = g.id 

V doesntのは、私は仕事ができる方法グラムへのアクセス権を持っているように見える:私はvalues.groupid = groups.id

は私が持っているクエリがある値テーブルからランダムに一つの行を選択しようとしていますこの周り?ランダムについては、value.idの値が削除されている可能性があり、小さなテーブル(最大200行まで)が存在するため、限界値1の解決策を得ることができました。私がjoin onのみを使用していて、join内にwhere句がない場合は、任意のグループからランダムな値を選択するか、何も返しません。誰でも助けてくれますか?

編集: この文句を言わない仕事のどちらか私は

SELECT g.* 
,(SELECT * FROM v ORDER BY RAND() LIMIT 1) 
FROM groups AS g 
JOIN 
(
    SELECT * FROM values 
) AS v ON v.groupid = g.id 

この時、外部からのVにアクセスすることはできませんので、私は非常によく似た他の多くの質問が表示されますが、どれも実際にグループごとに値に参加をしようとしません効果があります。私が行方不明の場合は、言及してください、私は問題を削除します、私は絶えず他の人を見ていますが、私はまだ助けが必要です。ありがとう

+0

私はこれが解決策だと思う、私はちょうど今http://recursive-design.comしようとしています/ blog/2009/08/11/mysql-select-random-row-with-join/ – Chris

+0

値テーブルに「プライマリ」キー識別子がありますか?もしあれば、そのカラム名は何ですか? – DRapp

答えて

1
SELECT u.login, a.filename FROM users u 
JOIN (SELECT filename, user_id, id AS rand_id FROM assets ORDER BY RAND()) a 
ON u.id = a.user_id 
WHERE a.filename IS NOT NULL 
GROUP BY user_id 
ORDER BY u.login; 
4

私はいつもORDER BY RAND()をSQLで使用することは避けています。データセットが本当に小さい場合を除いて、パフォーマンスはひどくなります。あなたのデータセットがそれほど小さければ、すべての行をアプリケーションに取り込み、ランダムな行を選択する方が良いでしょう。ここで

は、私はちょうどテスト済みのソリューションだし、それは各グループからランダムに一つの行を選択するために動作します:

SELECT g.*, v.* 
FROM Groups AS g 
INNER JOIN (
    SELECT groupid, COUNT(*) AS c, 1+FLOOR(RAND()*COUNT(*)) AS random 
    FROM `Values` GROUP BY groupid 
) AS c ON g.id = c.groupid 
INNER JOIN (SELECT @g:=0, @r:=0) AS init 
INNER JOIN (
    SELECT IF(groupid<>@g, @r:=1, @r:[email protected]+1) AS rank, @g:=groupid AS groupid, value 
    FROM `Values` 
    ORDER BY groupid 
) AS v ON g.id = v.groupid AND c.random = v.rank 
+0

私はこのクエリの90%を理解していると感じています。より良いパフォーマンスのクエリを提供することは非常に賢明です。クエリはかなり長く、読みにくいですが、展開すると難しくなるかもしれませんが、まだ素晴らしいですが、アプリケーションに負荷をかけることについて既に良い点を示しています.3つのソリューションをすべてテストしますあなたのデータベースが非常に活発であるとき、パフォーマンスは間違いなくゲームのチェンジャーになる可能性があります。ありがとう、c – Chris

関連する問題