7

現在のユーザーが投票していないランダムな結果を 1 つ表示する方法を教えてください。

現在、私のデータベース設定と私が試した最後のクエリはhttp://sqlfiddle.com/#!2/2f91b/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 が投票していない行のみを表示することができません。問題は、group by を使用すると、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、または投票されていないその他の項目のいずれかになります。

あなたの助け、アドバイス、知識は大歓迎です。

4

1 に答える 1

2

存在しないアイテムを取得するにはLEFT JOIN、正の一致を行うwith条件が必要です。次にWHERE、結果の列の1つに一致する句を次のように追加しNULLます。

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
于 2012-07-16T08:33:24.120 に答える