ugrás a tartalomhoz

SQL szavazás lekérés

Radon · 2014. Jan. 4. (Szo), 12.54
Sziasztok!
Van 1 programom, amiben pl könyvekre lehet szavazni, és azt akarom, hogy amire már szavaztam, azt ne dobja fel.
Van egy Books tábla, id mező.
és van egy Votes tábla, books_id, és user_id.

Szóval azok a books(id)-k kellenének, amik nincsenek a votes táblában a user_id mellett. Ezzel 2 gondom van. Mivel 1 lekérés, össze kell kötnöm a 2 táblát így:
  1. WHERE books.id=votes.books_id.  
de pont az ellentétét akarom.
A másik meg, hogy ha ezt a feltételt rakom be:
  1. WHERE votes.user_id!=$_SESSION['user_id']  
, nem zárja ki a hozzá tartozó books_id-t, ha közben érkezett erre a books_id-re mástól szavazat.

Elég egyszerűnek tűnik a probléma, logikai dolgot nem is szoktam kérdezni, de most vmiért nem ugrik be.
 
1

IS NULL

pkadam · 2014. Jan. 4. (Szo), 18.45
A két táblát LEFT JOIN-nal kötöd össze, és azokat a sorokat keresed, ahol hiányzik a hozzá tartozó szavazat a felhasználó részéről.
  1. SELECT  
  2.     *  
  3. FROM  
  4.     books  
  5. LEFT JOIN  
  6.     votes  
  7. ON  (  
  8.     books.id = votes.books_id  
  9.     AND  
  10.     votes.user_id = '{$_SESSION['user_id']}'  
  11.     )  
  12. WHERE  
  13.     votes.books_id IS NULL  
2

Kösz

Radon · 2014. Jan. 4. (Szo), 23.46
Isten vagy. köszi
3

A nyilvánvalóbb, de általában

tgr · 2014. Jan. 7. (K), 12.58
A nyilvánvalóbb, de általában kevésbé hatékony (SQL motorja válogatja) megoldás a
  1. SELECT *   
  2. FROM books   
  3. WHERE NOT EXISTS (  
  4.     SELECT *  
  5.     FROM votes  
  6.     WHERE votes.user_id = '{$_SESSION['user_id']}'   
  7.       AND votes.books_id = books.id  
  8. )