Se connecter avec
S'enregistrer | Connectez-vous
Résolu

mysql - condition WHERE qui soit résultat d'un autre SELECT

Dernière réponse : dans Programmation
Partagez

Toujours sur le même sujet, pour embêter un peu
J'ai une table clients avec 3 champs id, reference et age. Les 2 derniers étant des textes.

Ayant l'id d'un client X, j'aimerais récupérer tous les clients dont les 4 premières lettres de reference soit identique à celles du client X.

exemple:
id | reference | age
1 | 4bujtttt12 | 35
2 | xvcubuj4 | 28
4 | 4bujdfdfdf | 41
5 | wereztrrr | 19
6 | xvcubuj45 | 32
7 | wereztrrr | 37
8 | 4bujdfdfdf | 30
9 | xvcubuj45 | 41
10 | xvcubuj4 | 26
11 | 4bujtxtxdf | 21
12 | wereztrrr | 32

Résultats pour le client id = 12
5 | wereztrrr | 19
7 | wereztrrr | 37

J'ai fait une jointure:

  1. SELECT
  2. t1.id,
  3. t1.reference,
  4. t1.age
  5. FROM clients t1
  6. JOIN (
  7. SELECT
  8. clients.id,
  9. clients.reference,
  10. LEFT(clients.reference, 4) leftref4
  11. FROM clients
  12. WHERE clients.id=310
  13. ) t2
  14. ON LEFT(t1.reference, 4)=t2.leftref4
  15. WHERE t2.id<>t1.id


ça marche assez bien

J'aimerais savoir si il y a meilleure manière de faire. Surtout si on peut éviter la jointure.

Merci

Meilleure solution

Salut,

Ben il est très bien ton code.
(Sauf que tu surcharges un peu l'écriture et que tu sélectionnes des champs inutiles. Mais pour ce qui est de la jointure, c'est nickel.)

On peut toujours éviter une jointure.
Exemple :
  1. SELECT id,
  2. reference,
  3. age
  4. FROM clients
  5. WHERE LEFT(reference, 4) = LEFT(( SELECT reference
  6. FROM clients
  7. WHERE id = 310 ), 4)
  8. AND id <> 310


Mais ce n'est pas forcément une amélioration que de supprimer une jointure.
  • FireBird a sélectionné cette solution comme la meilleure réponse
Posez votre question