Bonjour,
je voudrais faire une requête pour récupérer tous les id_a qui ont pour id_b la valeur (1 OU 2) ET 4
--------------
| id_a | id_b |
--------------
| 1 | 1 |
| 1 | 2 |
| 1 | 4 |
| 2 | 3 |
| 2 | 2 |
| 4 | 4 |
Merci
Bonjour,
je voudrais faire une requête pour récupérer tous les id_a qui ont pour id_b la valeur (1 OU 2) ET 4
--------------
| id_a | id_b |
--------------
| 1 | 1 |
| 1 | 2 |
| 1 | 4 |
| 2 | 3 |
| 2 | 2 |
| 4 | 4 |
Merci
Quelque chose comme ça ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SELECT src.id_a FROM matable src WHERE src.id_b = 4 AND EXISTS ( SELECT NULL FROM matable det WHERE src.id_a = det.id_a AND det.id_b IN (1, 2) )
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous,
N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton
et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
Il faut une auto-jointure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT idA FROM la_table t1 INNER JOIN la_table t2 ON t2.idA = t1.idA WHERE t1.idB = 4 AND t2.idB IN (1, 2)
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
Je sais qu'on peut récupérer les id_a qui ont pour id_b la valeur (1 ET 2 ET 4) avec cette requête :
Mais pour faire (1 OU 2) ET (4), je ne sais pas si on peut partir du même principe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT id_a FROM table WHERE id_b IN (1,2,4) GROUP BY id_a HAVING COUNT(DISTINCT id_b) = 3;
Merci
al1_24 ,
Je faisais une requête similaire avant mais avec un WHERE IN et non un EXISTS avec un requête imbriquée mais dès que j'ai eu beaucoup de données, j'ai eu quelques soucis niveau performance....
Je crois, mais j'en suis pas sur, qu'un des défaut de MYSQL était les requêtes imbriquées dans des WHERE IN car sur une table de plus de 100 000/200 000, ce style de requête était d'un lenteur affreuse après avec un EXISTS ça doit être pareil ?
Merci
CinePhil,
Je suis d'accord avec l'auto jointure mais niveau performance sur une grosse table est-ce bien ?
Car justement je ne voulais pas partir sur ce genre de requête que ce soit avec une requête imbriqué ou avec auto jointure car je crois que son exécution est lente.
Dite moi si je me trompe
Je m'explique un peu plus, j'ai une table entre 500 000 et 1 000 000 de lignes donc si je dois faire un requête de ce style :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SELECT idA FROM la_table t1 INNER JOIN la_table t2 ON t2.idA = t1.idA INNER JOIN la_table t3 ON t3.idA = t1.idA INNER JOIN la_table t4 ON t4.idA = t1.idA WHERE t1.idB = 4 AND t2.idB IN (1, 2) AND t3.idB IN (100,200) AND t4.idB = 300
Chaque jointure me retourne plus de 300000 lignes comment va ce comporter un telle requête?
Merci.
Je ne connais pas l'optimiseur de MySQL mais je crains qu'il ne construise le sous-ensemble du IN avant d'exécuter le reste de la requête.
Théoriquement, si tu as un index sur (id_a, id_b), toute la recherche devrait se faire sur l'index...
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous,
N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton
et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.
Tu as essayé les deux solutions qu'on t'a données ?
La solution de al1_24 avec le EXISTS est peut-être un poil plus rapide avec un grand nombre de données.
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
Oui j'étais passé par ce type de requête imbriqué et auto- jointure et ce n'était pas concluant.
Mais pour pas dire n'importe quoi je vais les tester tout de suite et reviens vers vous.
Pour tout vous dire, pour faire obtenir le résultat voulu, je passe actuellement par des tables temporaires ...
ET la pareil niveau performance ce n'est pas trop top
Merci pour votre aide.
Et la solution d'aieeeuuuuu un peu au dessus ?
http://www.developpez.net/forums/d13...p/#post7155464
Bonjour,
Pour repartir du même principe, vous pouvez faire comme ça :
Si vous n'avez pas d’unicité sur le couple (id_a, id_b), il faudra dédoublonner les requêtes proposées par CinePhil et al1_24(avec un distinct).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 SELECT id_a FROM LaTable WHERE id_b IN (1,2,4) GROUP BY id_a HAVING COUNT(DISTINCT CASE WHEN id_b IN (1,2) THEN 1 WHEN id_b = 4 THEN 2 END ) = 2;
Si au contraire vous avez une contrainte d'unicité (et donc a priori les index qui vont avec...) la requête de al1_24 sera je pense plus performante...
Partager