39 votes

SÉLECTIONNEZ qui renvoie la liste des valeurs qui n'apparaissent dans aucune ligne

Requête :

select id from users where id in (1,2,3,4,5)

Si la table users contient les ids 1, 2, 3, cela retournerait 1, 2, et 3. Je veux une requête qui renverrait 4 et 5. En d'autres termes, je ne veux pas que la requête renvoie des lignes qui existent dans la table, je veux lui donner une liste de nombres et obtenir les valeurs de cette liste qui n'apparaissent pas dans la table.

(mise à jour pour clarifier la question suite à plusieurs réponses inapplicables)

21voto

Austin Points 2328

Si vous ne souhaitez pas (explicitement) utiliser des tableaux temporaires, cela fonctionnera :

SELECT id FROM (
  (SELECT 1 AS id) UNION ALL
  (SELECT 2 AS id) UNION ALL
  (SELECT 3 AS id) UNION ALL
  (SELECT 4 AS id) UNION ALL
  (SELECT 5 AS id)
) AS list
LEFT JOIN users USING (id)
WHERE users.id IS NULL

Cependant, c'est assez moche, assez long, et je doute de ce que cela donnerait si la liste des identifiants était longue.

16voto

BugFinder Points 7662

Compte tenu des nombres sont une liste fixe. La façon la plus rapide dont je peux penser est d'avoir une table de test, remplie avec ces nombres et faire

non testé sélectionner l'instruction - mais vous suivrez le princpal.

select test.number 
from test 
left join 
    users 
on 
    test.number = users.id 
where test.number <> users.id

Ensuite, vous obtiendrez tous les nombres qui n'ont pas un user.id correspondant et donc peut remplir les trous..

3voto

DaveyBoy Points 1677

Une autre option consiste à utiliser une autre table contenant tous les identifiants possibles, puis à faire une sélection à partir de celle-ci :

mysql> describe ids;
+-------+-----------------+------+-----+---------+-------+
| Field | Type            | Null | Key | Default | Extra |
+-------+-----------------+------+-----+---------+-------+
| id    | int(5) unsigned | NO   |     | 0       |       |
+-------+-----------------+------+-----+---------+-------+
1 row in set (0.05 sec)

mysql> select * from ids;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
+----+
5 rows in set (0.00 sec)

mysql> select * from users;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
+----+
3 rows in set (0.00 sec)


mysql> select id from ids where id not in (select id from users);
+----+
| id |
+----+
|  4 |
|  5 |
+----+
2 rows in set (0.04 sec)

Effet secondaire ajouté - vous permet d'étendre la liste des résultats en insérant dans la table ids

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X