Problème de jointure mysql

Problème de jointure mysql - SQL/NoSQL - Programmation

Marsh Posté le 08-03-2007 à 15:40:00    

Bonjour,
je vous expose rapidement mon problème:  
 
j'ai une table 'annonces' et une table 'photos'
dans cette table 'photos' il y a un champ "principale" qui est à 1 si cette photo à  été selectionnée comme principale. Mais il peut ne pas y avoir de photo principale pour une annonce.
 
Je cherche donc la jointure permettant de selectionner une annonce avec une photo, si elle existe, et la photo principale s'il y a une photo principale, sinon n'importe laquelle.
 
j'ai donc pour l'instant ma requete :

Code :
  1. SELECT a.titre,a.id,p.nom
  2. FROM annonces a
  3. LEFT JOIN photos p
  4. ON p.id_annonce=a.id
  5. GROUP BY id


 
à quel moment doit-on spécifier la condition du principale='1' ?

Reply

Marsh Posté le 08-03-2007 à 15:40:00   

Reply

Marsh Posté le 09-03-2007 à 10:12:29    

Il te faut 1 seule photo, ou bien toutes les photos, avec la principale en premier?


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 09-03-2007 à 10:25:46    

Il me faut une seule photo, et s'il y a, la principale

Reply

Marsh Posté le 09-03-2007 à 10:37:52    

ça va pas passer via une jointure seulement, ça...première idée, on trie les photos par le champ 'principale', et on ne garde que la première :
 
select a.titre, a.id, p.nom
from annonces a left join photos p on p.id_annonce=a.id
where p.nom =  
  ( select p2.nom  
    from photos p2
    where p2.id_annonce = a.id
    order by p2.principale desc
    limit 1)
 
Pas testé, et tapé vite fait ici...


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 09-03-2007 à 10:51:04    

ça fonctionne si l'annonce à une ou plusieurs photos, mais sinon elle ne sera pas dans les résultats.
 
Il n'existe pas une sorte de  
 
 

Code :
  1. SELECT a.titre,a.id,p.nom
  2. FROM annonces a
  3. LEFT JOIN photos p
  4. ON p.id_annonce=a.id ORDER BY p.principale DESC
  5. GROUP BY id


?
 
Comment il sélectionne la photo ? par son nom ? son id ? son index s'il y a?

Reply

Marsh Posté le 09-03-2007 à 10:53:21    

A moins que je sois très fatigué, le group by va te retourner autant de ligne par annonce qu'il trouve de photos.[:skeye]
 
T'avais pas précisé qu'il pouvait ne pas y avoir de photo...le plus simple est de le faire en deux requêtes, tout simplement, à mon avis, au lieu de t'emmerder.[:joce]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 09-03-2007 à 11:03:35    

ha ben oui, il peut ne pas y avoir de photo ! trop facile sinon... hum.
j'ai aussi un  

Code :
  1. count(p.id) as nbr_photos,


dans mon SELECT pour avoir le nombre de photo que possede chaque annonce.
 
Est ce que ce n'est pas au moment du "SELECT p.nom" qu'il faut préciser qu'on veut la principale ?
 
 
2 requètes quand on pourrait en faire une ?  :na:  
ya un moyen, ya un moyen

Reply

Marsh Posté le 09-03-2007 à 11:05:52    

bah tu peux modifier ma requête plus haut si tu veux, remarque.:o

Code :
  1. SELECT a.titre, a.id, p.nom
  2. FROM annonces a LEFT JOIN photos p ON p.id_annonce=a.id
  3. WHERE p.nom =  
  4.  ( SELECT p2.nom  
  5.    FROM photos p2
  6.    WHERE p2.id_annonce = a.id
  7.    ORDER BY p2.principale DESC
  8.    LIMIT 1)
  9. OR p.nom IS NULL


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 09-03-2007 à 11:14:48    

Ouais, ça me retourne bien les annonces avec la photo principale, ou pas principale, ou sans photo... mais... ya encore un petit soucis:
 

Code :
  1. SELECT a.titre, a.id, p.nom,COUNT(p.nom) as nbr_photos
  2. FROM annonces a LEFT JOIN photos p ON p.id_annonce=a.id
  3. WHERE p.nom = 
  4. ( SELECT p2.nom 
  5. FROM photos p2
  6. WHERE p2.id_annonce = a.id
  7. ORDER BY p2.principale DESC
  8. LIMIT 1)
  9. OR p.nom IS NULL


 
me retourne toujours nbr_photos = 1
Forcément...
 
raahhh  :pt1cable:

Reply

Marsh Posté le 09-03-2007 à 11:20:34    

ah ben oui, hein, on peut pas avoir le beurre et l'argent du beurre.:o


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 09-03-2007 à 11:20:34   

Reply

Marsh Posté le 09-03-2007 à 11:26:41    

j'aimerai bien pourtant ;)

Reply

Marsh Posté le 09-03-2007 à 11:30:13    

...et avec group by/having, tu peux pas t'en sortir?:o
 
genre
 

Code :
  1. SELECT a.titre, a.id, p.nom, count(*)
  2. FROM annonces a LEFT JOIN photos p ON p.id_annonce=a.id
  3. GROUP BY (a.titre, a.id)
  4. HAVING p.nom =  
  5.  ( SELECT p2.nom  
  6.    FROM photos p2
  7.    WHERE p2.id_annonce = a.id
  8.    ORDER BY p2.principale DESC
  9.    LIMIT 1)
  10. OR p.nom IS NULL


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 09-03-2007 à 11:48:33    

Non ça ne fonctionne pas, il me retourne que les annonces qui ont une photo, et ce ne sont pas les principales.

Reply

Marsh Posté le 09-03-2007 à 11:50:34    

oups.[:joce]

 

bah démerde-toi en 2 requêtes, là. Flemme de chercher une autre option.:o


Message édité par skeye le 09-03-2007 à 11:50:38

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 09-03-2007 à 11:52:01    

ben ouais, je crois que pour me dépanner je vais faire ça, mais c'est dommage. C'est pourtant une requete relativement classique quand on a une table "photos" .
 
Merci pour tout Skeye.

Reply

Marsh Posté le 09-03-2007 à 11:55:05    

Non, ta structure est mauvaise.[:dawao]
Ce qui serait classique, c'est d'avoir l'id de la photo principale dans ta table annonce...:o


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 09-03-2007 à 12:02:36    

ha ouais j'avais pas pensé à ça....
 
c'est pas bête en effet...
 
sinon j'ai trouvé une solution:

Code :
  1. SELECT a.titre, a.id, p.nom,count(p3.id) AS nbr_annonces
  2. FROM annonces a
  3. LEFT JOIN photos p ON p.id_annonce=a.id
  4. LEFT JOIN photos p3 ON p3.id_annonce=a.id
  5. WHERE p.nom =  
  6.  ( SELECT p2.nom  
  7.    FROM photos p2
  8.    WHERE p2.id_annonce = a.id
  9.    ORDER BY p2.principale DESC
  10.    LIMIT 1)
  11. OR p.nom IS NULL

Reply

Marsh Posté le 09-03-2007 à 12:05:25    

je modifie ma structure.
 
Merci,
Bonne journée

Reply

Marsh Posté le 09-03-2007 à 12:32:18    

papanoramix a écrit :

Ouais, ça me retourne bien les annonces avec la photo principale, ou pas principale, ou sans photo... mais... ya encore un petit soucis:
 

Code :
  1. SELECT a.titre, a.id, p.nom,COUNT(p.nom) as nbr_photos
  2. FROM annonces a LEFT JOIN photos p ON p.id_annonce=a.id
  3. WHERE p.nom = 
  4. ( SELECT p2.nom 
  5. FROM photos p2
  6. WHERE p2.id_annonce = a.id
  7. ORDER BY p2.principale DESC
  8. LIMIT 1)
  9. OR p.nom IS NULL


 
me retourne toujours nbr_photos = 1
Forcément...
 
raahhh  :pt1cable:


 

Code :
  1. SELECT a.titre, a.id, p.nom,SUM(case p.nom when null then 0 else 1 end) as nbr_photos
  2. FROM annonces a LEFT JOIN photos p ON p.id_annonce=a.id
  3. WHERE p.nom = 
  4. ( SELECT p2.nom 
  5. FROM photos p2
  6. WHERE p2.id_annonce = a.id
  7. ORDER BY p2.principale DESC
  8. LIMIT 1)
  9. OR p.nom IS NULL


 
:spamafote:

Reply

Marsh Posté le 09-03-2007 à 13:22:15    

En conservant la limite, j'aurais jointé sur le sous select (au lieu de le mettre dans le where) pour eviter ce probleme.  
Par contre magic, le sum sert à rien  ça remontera toujours 1 ou 0  :o

Reply

Marsh Posté le 09-03-2007 à 14:20:50    

ah ouais en effet, j'avais mal lu
 
faut dire aussi, c'est qui l'andouille qu'à mis un count() dans la requête originale ? :o

Reply

Marsh Posté le 09-03-2007 à 16:42:55    

heu... c'est moi. ça sert pas à ça un count ?
je connais pas cette synthaxe du case when then else, c'est nouveau ?

Reply

Marsh Posté le 09-03-2007 à 17:11:50    

si ça sert un ça un count mais count d'un truc avec limit à 1 ça risque pas de servir ;)
et case when nan s'pas nouveau non plus :o

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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