8796 sujets

Développement web côté serveur, CMS

bonjour,

Je teste les bases de donnée et j'ai beaucoup de mal pour faire une requete, voici ce à quoi j'aimerais arriver

table : article , pictures , liaison_pictures_articles

champs article : ID , TEXTART
pictures : ID , HREF , FIRSTPICTURE
liaison_pic_art : ID , ID_ART , ID_PICT

voici ma requete actuelle : "SELECT article.TEXT from article";

je voudrais obtenir le pictures.HREF

et c'est là ou j'ai du mal à construire ma requete

je veux le pictures.HREF de la pictures.ID = liaison_pic_art.ID_PICT si pictures.FIRSTPICTURE = 1 et qui correspond à article.ID = liaison_pic_art.ID_ART

je sais pas si vous me comprennez Smiley lol

En gros je voudrais lier l'adresse d'une image à un article et que cette image soit celle ou le champs FIRSTPICTURE = 1

Merci .

J'ai du mal avec ces requetes Smiley decu
Modifié par rs459 (22 Jul 2009 - 21:58)
en l'ecrivant comme ca je commence à voir un peu comment faire Smiley lol

pictures.href WHERE pictures.ID = liaison_pic_art.ID_PICT AND article.ID = liaison_pic_art.ID_ART AND pictures.FIRSTPICTURE = 1
Essais avec ça :
SELECT article.TEXTART, pictures.HREF 
FROM article, pictures INNER JOIN liaison_pic_art ON pictures.ID = liaison_pic_art.ID_PICT
WHERE pictures.FIRSTPICTURE = 1 AND article.ID = pictures.ID_ART


Je ne l'ai pas testé donc donne moi l'erreur s'il y en a une Smiley cligne
Nickel,

SELECT article.TEXTART, pictures.HREF
FROM article, pictures INNER JOIN liaison_pic_art ON pictures.ID = liaison_pic_art.ID_PICT
WHERE pictures.FIRSTPICTURE = 1 AND article.ID = pictures.ID_ART


Juste une petite erreur que j'ai corrigé en lisant à la fin ce n'était pas pictures.ID_ART mais liaison_pic_art.ID_ART
merci beaucoup pour ton aide !

Il faudra que je regarde INNER JOIN '*' ON '*' de plus prêt Smiley cligne
En effet Smiley ravi

Pour INNER JOIN ça te permet de fusionner (virtuellement) deux tables en fonction de la valeur de 2 champs.
En l'occurrence dans cette requête ça créé une table virtuel fusionnant las tables pictures et liaison_pic_art lorsque pictures.ID vaut liaison_pic_art.ID_PICT.
presque ça,
La bonne façon serait celle-ci :

SELECT article.TEXTART, pictures.HREF  
FROM pictures 
  INNER JOIN liaison_pic_art ON pictures.ID = liaison_pic_art.ID_PICT 
  INNER JOIN articles ON articles.ID = liaison_pic_art.ID_ART 
WHERE pictures.FIRSTPICTURE = 1


P.S : Jamais de cross join (pictures,articles) très gourmand, toujours des inner join... et puis pictures en premier car c'est sur lui que ce déroule la condition.
Modifié par masseuro (20 Jul 2009 - 11:53)
merci à tous les deux ca m'aide à mieu comprendre le "mécanisme" pour fusionner Smiley smile

juste une question pourquoi :

INNER JOIN articles ON articles.ID = liaison_pic_art.ID_ART


et pas

INNER JOIN liaison_pic_art ON articles.ID = liaison_pic_art.ID_ART


comme juste au dessus ? c'est à dire :

INNER JOIN [#red]liaison_pic_art[/#] ON pictures.ID = liaison_pic_art.ID_PICT


ca change peut être rien me diras tu !
La table après INNER JOIN est celle que tu "conserve" que tu utilises donc pour la suite de ta requête.
ha ok , par contre je suis embêté parce que la condition est trop stricte si je peux dire.

En fait ca fait bel et bien l'effet voulu sauf que je veux quand même avoir :

article.TEXTART (beaucoup plus que ca mais j'ai simplifié pour pas mettre 20champs) si je n'ai pas trouvé la concordance.

je crois que je vais m'acheter un bouquin d'exercice SQL sinon je vais devenir un boulet sur les forums Smiley lol
Et bien en fait j'aimerais avoir articles.TEXT même si je ne trouve pas de correspondance pour pictures.HREF
Dans ce cas il faut modifier le type de jointure.
SELECT article.TEXTART, pictures.HREF   
FROM pictures  
  INNER JOIN liaison_pic_art ON pictures.ID = liaison_pic_art.ID_PICT  
  RIGHT OUTER JOIN articles ON articles.ID = liaison_pic_art.ID_ART  
WHERE pictures.FIRSTPICTURE = 1 


RIGHT OUTER JOIN va permettre de conserver également les lignes de la table articles qui n'ont pas de correspondance ("RIGHT" car la table articles et cité à droite du mot clé "JOIN", le cas contraire on aurait mis "LEFT").

A tester si je n'ai pas fais d'erreur mais ça devrait marcher Smiley cligne
Modifié par moust (20 Jul 2009 - 19:17)
J'ai eu du mal mais j'ai fini par trouvé Smiley smile c'est vraiment complexe ces jointures Smiley bawling

SELECT article.TEXTART, pictures.HREF
FROM pictures
INNER JOIN liaison_pic_art ON pictures.ID = liaison_pic_art.ID_PICT
RIGHT OUTER JOIN articles ON articles.ID = liaison_pic_art.ID_ART
WHERE pictures.FIRSTPICTURE = 1 OR pictures.FIRSTPICTURE IS NULL

Merci à vous !
Salut,

Tu as déjà un problème de conception à la base.

Ce qu'on ne sait pas : Est-ce qu'une image peut être réutilisée dans un autre article ? Vu comme tu présentes ton problème, je dirais que non.

Mais nous allons étudier les deux hypothèses.


1. Image correspondant à un article et un seul

Dans ce cas-là ta table "liaison_pic_art" n'a pas lieu d'être et la clef primaire de ta table "article" devient clef étrangère de ta table "pictures".
Ce qui donne :

Table article : id_article, text_article
Table picture : id_picture, url_picture, first_picture, id_article

Ce qui nous amène à la requête simplette :

SELECT
   a.`text_article`,
   p.`url_picture`
FROM
   `article` a JOIN
   `picture` p USING( `id_article` )
WHERE
   p.`first_picture` = 1 AND
   a.`id_article` = 1 # Id de l'article à renseigner ou non, c'est selon ce que tu veux



2. Image correspondant à plusieurs articles

Dans ce cas-là, l'ID de ta table de liaison est inutile, puisque la clef primaire est double : id de l'article + id de l'image.
En plus, le champ first_picture est mal placé et devrait être dans la table de liaison.
Ce qui donne :

Table article : id_article, text_article
Table picture : id_picture, url_picture
Table article_picture : id_article, id_picture, first_picture

Ce qui nous amène à cette nouvelle requête simplette :

SELECT
   a.`text_article`,
   p.`url_picture`
FROM
   `article` a JOIN
   `article_picture` ap ON a.`id_article` = ap.`id_article` JOIN
   `picture` p ON ap.`id_picture` = p.`id_picture`
WHERE
   ap.`first_picture` = 1 AND
   a.`id_article` = 1 # Id de l'article à renseigner ou non, c'est selon ce que tu veux
Oui j'ai pas detaillé ce que je voulais faire.

cette requête est faire pour avoir une liste d'article sous forme de tableau
_______________________________________________________________________
| photo article | titre article | article text | dept vendeur | cat vendeur |
----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
| img001.jpeg | bidule | super bidule extra | 75 | pro |
| img002.jpeg | hyper truc | truc fantastique | 13 | part |
| NULL | machin | machin bizare | 45 | pro |
etc etc etc

1 Article plusieurs photos avec 1 photo principale (d'ou le firstimage)
1 vendeur plusieurs articles
1 article 1 vendeur

je souhaite réutiliser les photos (firstimage) par exemple pour faire une galerie mais elles seront pas liées à un autre article

donc j'ai fait ca :

table article : id_art , title_art , text_art
table pictures : id_picture , first_picture , href_picture
table liaison_art_pict : id , id_article , id_photo
table vendeur : id_vendeur , cat_vendeur , dept_vendeur , name_vendeur etc etc
table liaison_vendeur_art : id , id_vendeur , id_art

la première solution semble la bonne , je modifierais ma base et mes tables puis je testerais ca ce soir , me reste des progrès à faire surtout en modélisation avant même de vouloir faire mes "select" ou "insert"

Donc ca deviendrais ca :

table article : id_art , title_art , text_art , id_vendeur , etc etc
table pictures : id_picture , first_picture , href_picture , id_art
table vendeur : id_vendeur , cat_vendeur , dept_vendeur , name_vendeur etc etc
rs459 a écrit :
J'ai eu du mal mais j'ai fini par trouvé Smiley smile c'est vraiment complexe ces jointures Smiley bawling

SELECT article.TEXTART, pictures.HREF
FROM pictures
INNER JOIN liaison_pic_art ON pictures.ID = liaison_pic_art.ID_PICT
RIGHT OUTER JOIN articles ON articles.ID = liaison_pic_art.ID_ART
WHERE pictures.FIRSTPICTURE = 1 OR pictures.FIRSTPICTURE IS NULL

Merci à vous !


En effet, voilà ce que c'est que de ne pas tester avant de proposer une solution... ^^'

Ma solution n'était pas fausse sauf que le WHERE verrouillait le résultat, d'où ce que tu as rajouté.
Dans ce genre de situation rien de mieux que de limiter la requête en enlevant les WHERE pour analyser le résultat et affiner ensuite. Smiley cligne
Merci à vous j'ai enfin réussi à faire ce que je voulais .

comme je ne l'ai pas précisé la réponse d' Agylus (la premiere) est bonne , mais en realité j'avais aussi besoin des articles ne correspondant pas à firtimage = 1 qui sont eliminé si je fais une jointure INNER

je suis donc passé par une jointure LEFT OUTER .

j'ai enfin "compris" le principe de jointure INNER c'est rassembler 2 tables en 1 et seulement ce qui correspond alors que OUTER sert à mettre "cote à cote" 2 tables pas faites pour ca en gros.

Cette adresse m'a beaucoup aidé Smiley smile c'était incompréhensible pour moi avant, jointure ceci jointure cela , je commencais à croire que c'est moi qui avait abusé de jointure Smiley lol
http://mhubiche.developpez.com/Access/tutoJointures/