2010-01-22 6 views
0

Je crée une table qui montre tous les utilisateurs enregistrés auxquels l'utilisateur actuel ne s'est pas encore abonné. Mais une fois qu'il a souscrit à quelqu'un, je dois filtrer cette liste pour l'exclure.Requête sql utilisateur/abonné

Disons le theres une table appelée souscrit qui liste l'utilisateur et à qui il est abonné.

|UserId||SubscriberID| 

Il est facile de le faire en plusieurs requêtes, mais j'ai en vain essayé de le faire dans une requête, pour enregistrer une boucle supplémentaire d'appels MySQL.

Voici ce que j'ai jusqu'à présent:

SELECT u.UserID, FullName, UserName from users u 
    LEFT JOIN subscribed t ON 
    ((u.UserName LIKE '%$search%' OR 
     u.Email LIKE '%$search%') AND 
     ({$_SESSION['ID']} = t.UserID 
     AND t.FollowerID != u.UserID) 
    ) 

Je sais que la dernière partie de la requête est erronée, puisque je compare seulement si l'ID utilisateur et le FollowerID ne correspondent pas à une ligne particulière, pas table entière.

+0

La dernière partie doit être dans la clause Where de la requête, il travaillera dans chaque ligne, plutôt que de se joindre à toute la table ... –

+0

Ça ne semble rien changer. Peux-tu élaborer? –

Répondre

0

Pour trouver une liste des résultats dans le tableau A qui ne figurent pas dans le tableau B, vous avez deux options. Utilisez la syntaxe NOT IN ou LEFT JOIN et regardez où le champ PK dans la table B est NULL.

NOT IN exemple:

SELECT a.id FROM a WHERE a.id NOT IN (SELECT b.id FROM b)

LEFT JOIN exemple:

SELECT a.id FROM a LEFT JOIN b ON (a.id = b.id) WHERE (b.id IS NULL)

+1

Je dois mentionner que l'utilisation de 'NOT IN' avec une sous-requête va nécessiter MySQL 5.0 ou plus, et sera plus lente que l'idée' LEFT JOIN'. Personnellement, je préfère la sémantique de la syntaxe 'NOT IN' malgré son manque de performance tant que cela n'affecte pas significativement les temps de réponse de votre application. –

+1

MySQL 4.1 supporte aussi les sous-requêtes. –

+0

Oh, merci Bill, cela me semble familier maintenant que vous le mentionnez. –