1
votes

Problème de sélection des lignes par le même nombre

Il existe un tableau suivant:

 entrez la description de l'image ici

Les conditions suivantes doivent être remplies:

  1. La sélection se fait principalement par sender_id = 9 . Celui-ci est une contrainte principale.
  2. La valeur de 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?


0 commentaires

3 Réponses :


4
votes

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 .


3 commentaires

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) .



3
votes

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


0 commentaires

3
votes

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)


0 commentaires