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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Problème de jointure mysql

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème de jointure mysql

n°1525873
papanorami​x
Posté le 08-03-2007 à 15:40:00  profilanswer
 

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' ?

mood
Publicité
Posté le 08-03-2007 à 15:40:00  profilanswer
 

n°1526189
skeye
Posté le 09-03-2007 à 10:12:29  profilanswer
 

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 -
n°1526204
papanorami​x
Posté le 09-03-2007 à 10:25:46  profilanswer
 

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

n°1526233
skeye
Posté le 09-03-2007 à 10:37:52  profilanswer
 

ç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 -
n°1526251
papanorami​x
Posté le 09-03-2007 à 10:51:04  profilanswer
 

ç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?

n°1526253
skeye
Posté le 09-03-2007 à 10:53:21  profilanswer
 

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 -
n°1526259
papanorami​x
Posté le 09-03-2007 à 11:03:35  profilanswer
 

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

n°1526260
skeye
Posté le 09-03-2007 à 11:05:52  profilanswer
 

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 -
n°1526266
papanorami​x
Posté le 09-03-2007 à 11:14:48  profilanswer
 

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:

n°1526275
skeye
Posté le 09-03-2007 à 11:20:34  profilanswer
 

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 -
mood
Publicité
Posté le 09-03-2007 à 11:20:34  profilanswer
 

n°1526285
papanorami​x
Posté le 09-03-2007 à 11:26:41  profilanswer
 

j'aimerai bien pourtant ;)

n°1526288
skeye
Posté le 09-03-2007 à 11:30:13  profilanswer
 

...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 -
n°1526306
papanorami​x
Posté le 09-03-2007 à 11:48:33  profilanswer
 

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

n°1526307
skeye
Posté le 09-03-2007 à 11:50:34  profilanswer
 

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 -
n°1526309
papanorami​x
Posté le 09-03-2007 à 11:52:01  profilanswer
 

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.

n°1526310
skeye
Posté le 09-03-2007 à 11:55:05  profilanswer
 

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 -
n°1526314
papanorami​x
Posté le 09-03-2007 à 12:02:36  profilanswer
 

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

n°1526316
papanorami​x
Posté le 09-03-2007 à 12:05:25  profilanswer
 

je modifie ma structure.
 
Merci,
Bonne journée

n°1526331
MagicBuzz
Posté le 09-03-2007 à 12:32:18  profilanswer
 

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:

n°1526353
anapajari
s/travail/glanding on hfr/gs;
Posté le 09-03-2007 à 13:22:15  profilanswer
 

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

n°1526411
MagicBuzz
Posté le 09-03-2007 à 14:20:50  profilanswer
 

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

n°1526524
papanorami​x
Posté le 09-03-2007 à 16:42:55  profilanswer
 

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

n°1526533
anapajari
s/travail/glanding on hfr/gs;
Posté le 09-03-2007 à 17:11:50  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


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

  Problème de jointure mysql

 

Sujets relatifs
problème php avec nuked clanCalcul d'un % dans ma requete mysql
Liaison de donnees XBRL et Mysqlrecuperer le tableau affichage des données de mysql (dans easyphp) ?
SQlite + Python: Problème de "CREATE TABLE IF NOT EXISTS"problème avec l'utilisation d'un StateEdit
Probleme de jointure MySQLproblème de jointure avec deux tables avec mysql
[mysql] Problème de jointure [résolu merci antho1983][MySQL] Problème avec une requète (jointure ...)
Plus de sujets relatifs à : Problème de jointure mysql


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