2012-07-16 11 views
7

現在のユーザーが投票していないランダムな結果を表示するのに助けが必要です。現在、私のデータベースのセットアップと私が試してみました最後のクエリは基本的に私はこのクエリを使用して、個々の項目を分離することができますhttp://sqlfiddle.com/#!2/2f91b/1MySQL:投票していないランダムな結果を1つ表示する

で見つけることができ

SELECT a.img_url, a.item_id, a.user_id, a.img_status, b.item_question, c.user_name, c.user_fbid, d.voter_id, count(d.img_id) AS totalVotes 
FROM os_photos a 
LEFT JOIN os_items b ON a.item_id = b.item_id 
LEFT JOIN os_users c ON a.user_id = c.user_id 
LEFT JOIN os_votes d ON a.img_id = d.img_id 
GROUP BY a.img_id 
ORDER BY RAND() 
LIMIT 1 

私の問題は、次のとおりです。SQLの知識を持ちますユーザー2が投票していない行のみを表示するように結果を分離することはできません。私はグループを使用するときに問題が発生することを認識しています。これはvoter_idを結合しているため、ユーザー#2にアイテムの入力があるかどうかを確認できません。

例:

Item # | voter_id 
1  |  2 
1  |  3 
2  |  2 
3  |  1 
3  |  4 
4  |  3 
4  |  1 
5  |  1 
5  |  2 

上記のサンプルセットと、得られた項目は、いずれかのアイテム#3、#4または投票されていない他の項目でなければなりません。

あなたの助け、助言および知識は非常に高く評価されます。

答えて

2

は、あなたがそれ以外の場合は正の試合を行い、その後、NULLに結果のいずれかの列に一致するWHERE句を追加した状態でLEFT JOIN必要存在してはいけない項目を取得するには:私が試した

SELECT a.img_url, a.item_id, a.user_id, a.img_status, b.item_question, c.user_name,c.user_fbid, d.voter_id, count(d.img_id) AS totalVotes 
FROM os_photos a 
LEFT JOIN os_items b ON a.item_id = b.item_id 
LEFT JOIN os_users c ON a.user_id = c.user_id 
LEFT JOIN os_votes d ON a.img_id = d.img_id 
LEFT JOIN os_votes d2 ON a.img_id = d2.img_id AND d2.voter_id=2 
WHERE d2.voter_id IS NULL 
GROUP BY a.img_id 
ORDER BY RAND() 
LIMIT 1 
+1

をあなたのコードはSQLfiddleで、それは私にエラーを与えた。私はまた、結果がどのように見えるかの例を追加しました。 –

+0

@MichaelCheungは固定されています... 'WHERE'は常に' GROUP BY'の前に行くべきです。私は間違った行にそれを貼り付けた;)申し訳ありません – poncha

+0

ありがとう、それは、クエリを修正しましたが、それは私に結果ではないはずです。たとえば、ユーザー#2が既にアイテム#3に投票していたため、それは不要なときにアイテム#3の結果を返します。 –

関連する問題