Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1133 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL] SELECT avec LEFT JOIN et LIMIT

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[MySQL] SELECT avec LEFT JOIN et LIMIT

n°1596370
goldorak69
Posté le 06-08-2007 à 19:27:25  profilanswer
 

Bonjour, j'ai un petit problème de requête et j'ai beau me triturer la tête je ne trouve pas la solution.

 

pour faire simple j'ai deux tables:

 
Code :
  1. TABLE a
  2. --------
  3. id
  4. name
  5. TABLE b
  6. --------
  7. id
  8. name
  9. TABLE c
  10. --------
  11. id_table_a
  12. id_table_b
  13. value
 

j'aimerai récupérer les 10 premiers éléments de la table A avec les infos de la table B (en sachant que la relation A-B est n-aire):

 
Code :
  1. SELECT a.name, b.name, c.value
  2. FROM a
  3. LEFT JOIN c ON c.id_table_a=a.id
  4. LEFT JOIN b ON c.id_table_b=b.id
  5. ORDER BY a.id
  6. LIMIT 0,10
 

Avec cette requête je récupère les 10 premières lignes mais pas nécessairement les 10 premiers éléments de la table A.

 

Qu'est-ce que je dois modifier/ajouter?  :??:


Message édité par goldorak69 le 06-08-2007 à 20:26:20
mood
Publicité
Posté le 06-08-2007 à 19:27:25  profilanswer
 

n°1596372
MagicBuzz
Posté le 06-08-2007 à 19:29:20  profilanswer
 

order by a.id

n°1596392
goldorak69
Posté le 06-08-2007 à 20:26:02  profilanswer
 

oui j'avais oublié le "order by" dans la requête, c'est rajouté, mais ça ne change rien au résultat.

n°1596399
goldorak69
Posté le 06-08-2007 à 20:32:31  profilanswer
 

ca marche avec un "group by a.id" mais du coup je n'ai qu'une ligne pour chaque résultat et donc pas toutes les valeurs de c.value voulues.


Message édité par goldorak69 le 22-08-2007 à 15:25:39
n°1596416
TheRom_S
Posté le 06-08-2007 à 21:03:07  profilanswer
 

order by c.id_table_a


---------------
The Rom's, à votre service
n°1601289
Noren2
Posté le 20-08-2007 à 17:20:05  profilanswer
 

Essaye :
 

Code :
  1. select *
  2. from
  3. (
  4. SELECT a.name, b.name, c.value
  5. FROM a
  6. LEFT JOIN c ON c.id_table_a=a.id
  7. LEFT JOIN b ON c.id_table_b=b.id
  8. ORDER BY a.id
  9. )
  10. LIMIT 0,10


 
Si c'est comme sous oracle avec le rownum, ca devrait marcher ..


Message édité par Noren2 le 20-08-2007 à 17:20:56
n°1602407
goldorak69
Posté le 22-08-2007 à 15:31:24  profilanswer
 

j'ai essayé çà

Code :
  1. select temp.* from (
  2. select a.name, b.name, c.value
  3. from a
  4. left join c on c.id_table_a=a.id
  5. left join b on c.id_table_b=b.id
  6. order by a.id
  7. ) temp limit 0,10


 
toujours le même résultat: les 10 premières lignes et non les 10 premières valeurs de a avec celles de c correspondantes...

n°1602455
MagicBuzz
Posté le 22-08-2007 à 16:31:45  profilanswer
 

Je viens de relire ton énoncé, et en fait, déjà, t'es mal parti...
 
Si j'ai bien compris, mettons que tu as en moyenne N éléments b pour chaque élément a, alors c'est pas 10 lignes que tu veux, mais l'ensemble des lignes pour les 10 premiers éléments a, c'est bien ça ?
Donc 10 x N lignes en gros...
 
Donc d'entrée de jeu, ton LIMIT ne peut pas porter sur le résultat final !
 
Dans ces cas là, on cherche pas midi à 14 heures, on y va pas à pas :
 
Les 10 premiers éléments de A :
 

Code :
  1. SELECT a.id, a.name
  2. FROM a
  3. ORDER BY a.id
  4. LIMIT 0, 10


 
Et pour ces 10 éléments, tu veux les éléments de b :
 

Code :
  1. SELECT dixa.name, b.name, c.value
  2. FROM
  3. (
  4.  SELECT a.id, a.name
  5.  FROM a
  6.  ORDER BY a.name
  7.  LIMIT 0, 10
  8. ) dixa
  9. INNER JOIN c ON c.id_table_a = dixa.id
  10. INNER JOIN b ON b.id = c.id_table_b
  11. ORDER BY dixa.name, b.name


 
En espérant que MySQL accepte de faire un LIMIT dans une sous-requête.


Message édité par MagicBuzz le 22-08-2007 à 16:33:16
n°1602470
goldorak69
Posté le 22-08-2007 à 16:48:48  profilanswer
 

OMG ca marche, merci toi!!  :bounce:  :bounce:  :bounce:  
 
j'avais déjà essayé ça:

Code :
  1. SELECT a.name, b.name, c.value
  2. FROM a
  3. LEFT JOIN c ON c.id_table_a = tmp.id
  4. LEFT JOIN b ON b.id = c.id_table_b
  5. WHERE a.id IN (
  6.     SELECT a.id
  7.     FROM a
  8.     LIMIT 0,10
  9. )
  10. ORDER BY a.id


 
mais le "LIMIT" dans la sous requête ne passait pas, j'avais donc laissé tomber cette piste.
 
Un grand merci encore  :bounce:  :bounce:  :bounce:  :bounce:  :bounce:

n°1602478
MagicBuzz
Posté le 22-08-2007 à 16:55:40  profilanswer
 

Y'avait de l'idée dans ton truc.
A mon avis, ça marchait, y'a juste qu'il n'y a pas de order by dans ton sous-select, ce qui fait que le limit se fait "à la vas-y comme je te pousse", donc t'as 10 lignes, mais pas forcément les 10 premières (enfin... pour lui, si, mais pas pour toi ;))
 
(bon, pis y'avait un peu un tmp.id à remplacer par un a.id surtout !)


Message édité par MagicBuzz le 22-08-2007 à 16:56:31

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL] SELECT avec LEFT JOIN et LIMIT

 

Sujets relatifs
[Résolu][MYSQL] lister les doublons + rapidement[MYSQL] Soucis avec matching sur requete moteur de recherche
activate, selectMysql
[MySQL] probleme de clé etrangereConnexion à MySQL
Probleme avec DISTINCT / MySQL[MySQL] Moteur de recherche MATCH
Problème de comparaison de mots de passe MySQLMySQL - Optimisation d'une requête avec plusieurs JOIN
Plus de sujets relatifs à : [MySQL] SELECT avec LEFT JOIN et LIMIT


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR