Page 1 sur 2

Joindre deux table sql

Posté : 26 déc. 2011, 12:34
par foxxy
Bonjour,

Je ne suis pas à l'aise avec sql dès que ca se complique un peu.
Je voudrais afficher les URL des photos de l'utilisateur qui a sa session active. Voici la composition de la BDD:

Table user:
id
nom
...

Table photos:
id
URL
...

Table id:
id_user
id_photos

A quoi ressemble une telle requête?
Merci!

Re: Joindre deux table sql

Posté : 26 déc. 2011, 17:28
par Ryle
Tu peux constituer ta requête ainsi :
SELECT les champs que tu veux récupérer
  FROM la table que tu veux interroger
     LEFT JOIN la tabIe à laquelle elle est liée ON les critères qui te permettent de lier tes 2 tabIes
     ...
  WHERE les criteres de filtre des résultats
Il faut donc faire le lien entre ta table photo (qui contient l'url) et une table qui contient l'id de l'utilisateur
SELECT url
  FROM photo
    LEFT JOIN id ON photo.id = id.id_photo
  WHERE id.id_user = xxx
En remplaçant xxx par l'id du user en session tu devrais approcher de ce que tu souhaites :)

Re: Joindre deux table sql

Posté : 26 déc. 2011, 22:09
par Elie
Je fais ca a l'ancienne moi :
SELECT `photo`.`url` FROM `photo`, `id`WHERE `photo`.`id` = `id`.`id_photo` AND `id`.`id_user` = xxxx

Re: Joindre deux table sql

Posté : 26 déc. 2011, 23:58
par Ryle
Ca marche aussi :) (mais ça permet pas de faire de jointures externes)

Pis personnellement j'aime bien le fait de séparer les conditions qui lient les tables de celles qui filtrent les résultats :)

Re: Joindre deux table sql

Posté : 27 déc. 2011, 10:21
par xTG
La syntaxe ANSI permet surtout de moins factoriser ce qui apporte un gain de temps considérable sur certaines requêtes.
Au lieu d'aller faire du NxN on peut arriver à du NxM en utilisant pour la même requête les deux méthodes de jointures.
La seconde est bien plus intéressante. ;)

Re: Joindre deux table sql

Posté : 27 déc. 2011, 12:23
par Elie
Ouais mais si je veux recuperer des informations dans les 2 tables, quel est la meilleure solution ?

Re: Joindre deux table sql

Posté : 27 déc. 2011, 12:24
par xTG
Les jointures telles que présentées par Ryle.

Re: Joindre deux table sql

Posté : 27 déc. 2011, 12:48
par Elie
Et si 2 champs ont les memes noms dans les 2 tables. Comment les differencier ?
Je peux avoir un exemple au final ?

Merci,

Elie

Re: Joindre deux table sql

Posté : 27 déc. 2011, 13:47
par xTG
Tu les prefixes par le nom de la table.
SELECT table1.champ, table2.champ
FROM table1 LEFT JOIN table2
    ON table1.id = table2.id

Re: Joindre deux table sql

Posté : 27 déc. 2011, 18:12
par foxxy
Merci ! Mais j'ai encore un ptit soucis. Je ne dispose que du login du membre pas de son id. Or ici le filtre que vous proposez est relatif à l'id du user. Est ce que je dois faire une autre requête avant pour trouver cet id ou est ce que c'est possible de le faire en modifiant un peu la requête que vous m'avez donné ?

J'en suis ici:

Code : Tout sélectionner

<?php include('login.php'); $sql2=mysql_query('SELECT name FROM modelBook_photos LEFT JOIN modelBook_id ON modelBook_photos.id = modelBook_id.id_photo WHERE modelBook_id.id_user ="'.$pseudobook.'"'); while( $photoBook = mysql_fetch_assoc($sql2) ){ ?> <li><img src="photos/m-<?php echo $photoBook['name'] ?>" alt="#" /></li> <?php } ?>

Re: Joindre deux table sql

Posté : 27 déc. 2011, 18:48
par xTG
On peut faire une sous-requête mais bon... J'en suis pas trop adepte, si tes données ne proviennent pas d'un formulaire de recherche mais d'un page de membre je te conseillerai de revoir la construction de la session d'identification pour y inclure l'id.
$requete = "SELECT name FROM modelBook_photos
LEFT JOIN modelBook_id ON modelBook_photos.id = modelBook_id.id_photo
WHERE modelBook_id.id_user = (SELECT id FROM membre WHERE pseudo = '" . mysql_real_escape_string($pseudo) .'")";

Re: Joindre deux table sql

Posté : 27 déc. 2011, 20:09
par foxxy
Merci xTG

J'ai toujours un problème pour faire marcher le script et ca, même si je met un id à la place de la sous-requête.
Genre:

Code : Tout sélectionner

$requete = "SELECT name FROM modelBook_photos LEFT JOIN modelBook_id ON modelBook_photos.id = modelBook_id.id_photo WHERE modelBook_id.id_user = '8' ";
La requête de Ryle serait-elle incorrect? Ou cela vient il de mon script? Rien ne s'affiche sur la page, le while ne semble ne pas fonctionner avec cette requête.

Quand à la page membre que tu évoque, il n'est aucunement question de session. Je cherche juste à afficher les photos d'un membre sur sa page. Même sans être logé, tout le monde peut y accéder. Ca n'est pas son administration de galerie donc pas de session, la sous-requête est donc bien nécessaire.

Re: Joindre deux table sql

Posté : 27 déc. 2011, 20:59
par Ryle
En fait, il te faut lier tes différentes tables jusqu'à celle qui t'apporte l'information dont tu as besoin :
SELECT url
  FROM photo
    LEFT JOIN id ON photo.id = id.id_photo
    LEFT JOIN user ON id.id_user = user.id
  WHERE id.id_user = xxx
Quant au problème d'exécution, il faut procéder par étape :
- est ce que si tu exécutes la requête générée directement dans phpMyAdmin, tu obtiens le bon résultat ? Si non le problème de la requête (et tu devrais avoir un message d'erreur pour t'en dire plus), si oui le problème vient du code :)
- dans ce cas, est ce que le code source généré est bon ?
- ...

Re: Joindre deux table sql

Posté : 27 déc. 2011, 21:32
par foxxy
Mon message d'erreur est le suivant:

Code : Tout sélectionner

Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in [...] on line 49
A cette ligne il y a le while et donc on peut en conclure qu'il tolère mal la requête.
Voila le script:
<?php
include('login.php');
$sql2=mysql_query('SELECT name
		FROM modelBook_photos
		LEFT JOIN modelBook_id ON modelBook_photos.id = modelBook_id.id_photo
		LEFT JOIN modelBook_user ON modelBook_id.id_user = modelBook_user.id
		WHERE modelBook_id.id_user = 8');

while($photoBook = mysql_fetch_assoc($sql2)){ 
?>
	<li><img src="photos/m-<?php echo $photoBook['name'] ?>" alt="#" /></li>
<?php } ?>
J'ai mis 8 car j'ai un user qui possède bien cette id. On devrai voir ses photos.

Mes tables sont nommées ainsi:
modelBook_id (id_user, id_photo)
modelBook_photos (id, name) //name est le lien URL
modelBook_user (id, login)

Il me semble pourtant avoir tout adapté dans la requête que tu m'as proposé :?
Je cherche bien à afficher les photos du champs "name" du user dont l'id est "8".

Re: Joindre deux table sql

Posté : 27 déc. 2011, 23:07
par xTG
Regardes ce que retourne mysql_error() ;)