2012-07-16 12 views
7

Potrzebuję pomocy w wyświetleniu jednego losowego wyniku, w którym bieżący użytkownik nie głosował.MySQL: Wyświetl jeden losowy wynik, na który użytkownik nie głosował.

Obecnie moja konfiguracja bazy danych i ostatnie zapytanie Próbowałem znaleźć można na http://sqlfiddle.com/#!2/2f91b/1

Zasadniczo mogę odizolować każdy pojedynczy element za pomocą tej kwerendy:

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 

mój problem jest: Dzięki znajomości SQL Mam, nie jestem w stanie wyizolować wyników, aby pokazać tylko te wiersze, w których użytkownik nr 2 nie głosował. Zdaję sobie sprawę, że problem występuje, gdy używam grupy przez, łączy on identyfikator voter_id i dlatego nie jestem w stanie sprawdzić, czy użytkownik nr 2 ma jakiekolwiek dane wejściowe dla elementu.

Przykład:

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

Z powyższego zestawu próbek, uzyskana pozycja powinna być pozycja # 3, # 4 lub wszelkie inne przedmioty, które nie przydatne na.

Twoja pomoc, doradztwo i wiedza są bardzo doceniane.

Odpowiedz

2

Aby otrzymać przedmioty, które dont istnieją potrzebny jest LEFT JOIN z warunkiem, że inaczej będzie miało pozytywny mecz, a następnie dodać WHERE klauzuli dopasowanie jednego z powstałych kolumn 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 
+1

Próbowałam Twój kod w SQLfiddle i spowodował błąd. Dodałem także przykład, jak powinny wyglądać wyniki w przypadku, który pomaga. –

+0

@MichaelCheung naprawiono ... "GDZIE" powinno zawsze iść przed 'GROUP BY'. wkleiłem go w niewłaściwą linię;) sorry – poncha

+0

Dzięki, że poprawiono zapytanie, ale nadal daje mi wyniki, których nie powinno. Na przykład daje wynik nr 3, gdy nie powinien, ponieważ użytkownik nr 2 już głosował na punkt # 3. –