Eh bien, désolé mais je ne sais pas comment formuler correctement le sujet. C'est pourquoi je ferais mieux de décrire le problème.
J'ai une sorte de tableau suivant:
select t1.Name, t1.v1 from `Test` as t1 join ( select Name from `Test` where v1 = 7 ) as t2 on t1.Name != t2.Name
Ce dont j'ai besoin est de trouver tous les noms qui correspondent par exemple à 7. Ce sont 'C'
, 'D'
et 'G'
.
Et maintenant, je dois sélectionner toutes les lignes sauf 'C'
, 'D'
et 'G'
.
La table résultante est censée être:
=============== | Name | v1 | |âââââââââââââ| | A | 4 | | A | 3 | | B | 6 | | E | 3 | | F | 1 | | F | 2 | | H | 9 | | H | 1 | | I | 5 | |âââââââââââââ|
J'ai essayé la requête:
CREATE TABLE IF NOT EXISTS `Test` ( `Id` INT NOT NULL AUTO_INCREMENT, `Name` VARCHAR(5) NOT NULL, `v1` INT NOT NULL, PRIMARY KEY (`Id`) ); INSERT INTO `Test` (`Name`, `v1`) VALUES ('A', 4), ('A', 3), ('B', 6), ('C', 1), ('C', 2), ('C', 7), ('D', 7), ('D', 5), ('E', 3), ('F', 1), ('F', 2), ('G', 7), ('H', 9), ('H', 1), ('I', 5);
mais je me suis seulement rendu compte que je ne comprenais toujours pas la mécanique des instructions JOIN
.
J'espère de l'aide avec ce problème.
Merci d'avance.
3 Réponses :
Vous pouvez utiliser not exists
:
select t.* from test t where not exists (select 1 from test t2 where t2.name = t.name and t2.v1 = 7 );
Ceci sélectionne toutes les lignes du test
où le nom de la ligne n'a pas de ligne avec 7
, n'importe où dans le tableau.
Voici comment procéder avec les JOINs ...
SELECT x.* FROM test x LEFT JOIN test y ON y.name = x.name AND y.v1 = 7 WHERE y.id IS NULL; +----+------+----+ | Id | Name | v1 | +----+------+----+ | 1 | A | 4 | | 2 | A | 3 | | 3 | B | 6 | | 9 | E | 3 | | 10 | F | 1 | | 11 | F | 2 | | 13 | H | 9 | | 14 | H | 1 | | 15 | I | 5 | +----+------+----+
Cette requête:
> Id | Name | v1 > -: | :--- | -: > 1 | A | 4 > 2 | A | 3 > 3 | B | 6 > 9 | E | 3 > 10 | F | 1 > 11 | F | 2 > 13 | H | 9 > 14 | H | 1 > 15 | I | 5
renvoie tous les Name
que vous souhaitez exclure.
Utilisez-le avec l'opérateur NOT IN
:
SELECT * FROM Test WHERE Name NOT IN (SELECT Name FROM Test WHERE v1 = 7)
Voir la démo .
Résultats:
SELECT Name FROM Test WHERE v1 = 7