Joindre deux table sql

Eléphanteau du PHP | 10 Messages

26 déc. 2011, 12:34

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!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 déc. 2011, 17:28

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 1339 Messages

26 déc. 2011, 22:09

Je fais ca a l'ancienne moi :
SELECT `photo`.`url` FROM `photo`, `id`WHERE `photo`.`id` = `id`.`id_photo` AND `id`.`id_user` = xxxx
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 déc. 2011, 23:58

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
xTG
ViPHP | 7331 Messages

27 déc. 2011, 10:21

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

Mammouth du PHP | 1339 Messages

27 déc. 2011, 12:23

Ouais mais si je veux recuperer des informations dans les 2 tables, quel est la meilleure solution ?
Bon sinon tu me fais un message privé et on se fait un TeamViewer

ViPHP
xTG
ViPHP | 7331 Messages

27 déc. 2011, 12:24

Les jointures telles que présentées par Ryle.

Mammouth du PHP | 1339 Messages

27 déc. 2011, 12:48

Et si 2 champs ont les memes noms dans les 2 tables. Comment les differencier ?
Je peux avoir un exemple au final ?

Merci,

Elie
Bon sinon tu me fais un message privé et on se fait un TeamViewer

ViPHP
xTG
ViPHP | 7331 Messages

27 déc. 2011, 13:47

Tu les prefixes par le nom de la table.
SELECT table1.champ, table2.champ
FROM table1 LEFT JOIN table2
    ON table1.id = table2.id

Eléphanteau du PHP | 10 Messages

27 déc. 2011, 18:12

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

ViPHP
xTG
ViPHP | 7331 Messages

27 déc. 2011, 18:48

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) .'")";

Eléphanteau du PHP | 10 Messages

27 déc. 2011, 20:09

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.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 déc. 2011, 20:59

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 ?
- ...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 10 Messages

27 déc. 2011, 21:32

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

ViPHP
xTG
ViPHP | 7331 Messages

27 déc. 2011, 23:07

Regardes ce que retourne mysql_error() ;)