[MySQL] SELECT avec LEFT JOIN et LIMIT

SELECT avec LEFT JOIN et LIMIT [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 06-08-2007 à 19:27:25    

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
Reply

Marsh Posté le 06-08-2007 à 19:27:25   

Reply

Marsh Posté le 06-08-2007 à 19:29:20    

order by a.id

Reply

Marsh Posté le 06-08-2007 à 20:26:02    

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

Reply

Marsh Posté le 06-08-2007 à 20:32:31    

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
Reply

Marsh Posté le 06-08-2007 à 21:03:07    

order by c.id_table_a


---------------
The Rom's, à votre service
Reply

Marsh Posté le 20-08-2007 à 17:20:05    

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
Reply

Marsh Posté le 22-08-2007 à 15:31:24    

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...

Reply

Marsh Posté le 22-08-2007 à 16:31:45    

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
Reply

Marsh Posté le 22-08-2007 à 16:48:48    

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:

Reply

Marsh Posté le 22-08-2007 à 16:55:40    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed