2012-04-24 7 views
2

J'ai mes tables posts et user_unread_posts. Dans posts, tous les messages d'un forum sont enregistrés, et dans user_unread_posts tous les messages sont enregistrés qui sont lus par un utilisateur.MySQL - rangée aléatoire très compliquée

user_undread_posts ressemble à ceci:

id uid pid 

Maintenant, je veux permettre aux utilisateurs d'ouvrir un poste au hasard qu'ils ont pas lu. J'ai essayé quelque chose comme

SELECT * FROM posts 
LEFT JOIN user_unread_posts uup 
ON uup.pid=posts.id 
WHERE uup.uid<>1 
ORDER BY RAND() 
LIMIT 1 

(Alors que 1 est un espace réservé UID)

Mais cela ne fonctionne pas, comme cela devrait fonctionner, il retourne les messages aussi, qui sont lus ... Comment Je répare ça?

+0

de messages INNER JOIN user_unread_posts? –

+0

Est-ce que je fais un mauvais test: vous stockez les messages lus dans une table appelée "messages non lus"? – Quassnoi

+0

Non, oui: C'était un exemple, les vrais noms de tables ne sont pas comme ça. Stupide moi ... – ninov

Répondre

1
SELECT * 
FROM posts 
WHERE id NOT IN 
     (
     SELECT pid 
     FROM user_unread_posts uup 
     WHERE uid = $myuserid 
     ) 
ORDER BY 
     RAND() 
LIMIT 1 
+0

Ok, ça marche super bien. Je vous remercie – ninov

0

Vous vouliez utiliser IS NULL avec LEFT JOIN. L'utilisation de <> transforme le jointure gauche en jointure interne car la valeur NULL ne peut jamais correspondre à l'opérateur <>.

Voici une requête corrigée:

SELECT * FROM posts 
LEFT JOIN user_unread_posts uup 
ON uup.pid=posts.id 
WHERE uup.uid IS NULL 
ORDER BY RAND() 
LIMIT 1