Il existe un tableau suivant:
Les conditions suivantes doivent être remplies:
sender_id = 9 . Celui-ci est une contrainte principale. receiver_id ne doit jamais correspondre à la colonne sender_id . Seules ces lignes doivent être sélectionnées. Ce que j'essaie de faire est:
SELECT DISTINCT
receiver_id
FROM
users_messages
GROUP BY
receiver_id ,
sender_id
HAVING
COUNT(receiver_id) = COUNT(sender_id) AND sender_id = 9 AND receiver_id != 9
Et par là, je m'attends à ce que la sortie soit seulement 10 code>. Mais le problème est qu'il sélectionne également 2 , ce qui brise la deuxième condition énoncée ci-dessus.
Quel est le problème avec cette requête?
3 Réponses :
Est-ce ce que vous voulez?
select um.*
from user_messages um
where rm.sender = 9 and
not exists (select 1
from user_messages um2
where um2.sender = um.receiver
);
Si vous ne voulez que les récepteurs, vous pouvez - bien sûr - utiliser select distinct um.receiver .
C'est exactement ça. Mais puisque votre réponse suggère une sous-requête, ne deviendrait-elle pas vraiment de plus en plus lente lorsque les données commenceraient à croître?
assurez-vous que [not] existe s'exécute rapidement principalement @Yang
@Yang. . . Si les performances sont un problème, vous voulez un index sur user_messages (expéditeur, destinataire) .
Vous pouvez effectuer une auto-jointure à gauche et renvoyer les lignes sans correspondance:
select distinct u1.receiver_id from users_messages u1 left join users_messages u2 on u2.sender_id = u1.receiver_id and u2.receiver_id = u1.sender_id where u1.sender_id = 9 and u2.id is null
La solution la plus simple, la plus rapide et la plus logique
SELECT * FROM `some` WHERE sender_id = 9 AND receiver_id NOT IN (SELECT DISTINCT sender_id FROM some)