Jointures de tables l'éternel problème ...

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Jointures de tables l'éternel problème ...

Re: Jointures de tables l'éternel problème ...

par visualight » 22 oct. 2009, 19:02

Ca marche aussi c'est deux visions de la même base de données mais l'idée et la même :) Bon reste plus qu'a cliqué pour mettre ton sujet en résolu :)
Ah il y a un bouton résolu ?
Je pensais que c'était le bouton "V" à côté d "citer" qui faisait office "résolu".

Le bouton résolu est ou ?

Re: Jointures de tables l'éternel problème ...

par fab » 22 oct. 2009, 17:05

Ca marche aussi c'est deux visions de la même base de données mais l'idée et la même :) Bon reste plus qu'a cliqué pour mettre ton sujet en résolu :)

Re: Jointures de tables l'éternel problème ...

par visualight » 22 oct. 2009, 17:03

Tout d'abord, merci à tous pour vos réponses.
Je vais faire comme kran à dit.

Je supprime la table video et je la fusionne avec la table photo pour n'effectuer ainsi qu'une jointure de type right.
Jusqu'à présent ça marche ^^

Merci pour tout,
Raph

Re: Jointures de tables l'éternel problème ...

par Kran » 22 oct. 2009, 14:10

Je viens de tester ce code mais une erreur survient me disant : Duplicate column name 'gallery_id'
Pour résoudre ce problème, il te suffit de nommer les colonnes que tu veux voir affichées dans le résultat de ta requête une par une au lieu d'utiliser * à la mode bourrin ^^

Sinon, après avoir vu la structure de tes tables, moi je pencherait pour réunir tes photos et tes vidéos dans une seule et même table !

Les tables te servant à stocker les photos et les vidéos sont très proches... en gros tu utilises :
- un champ pour stocker le numéro de la gallerie
- un champ pour stocker le titre à afficher
- un champ pour stocker le chemin ou aller chercher le fichier

Le fait de créer un champ "photo_filename" et un autre "photo_url" ne me parait pas très efficace...
Je serais toi, je rajouterai plutot :
- un champ pour stocker le type de contenu : photo ou video
- un champ pour stocker le type d'accès au contenu : url ou path local

Et en fonction de ça il serait facil de paramètrer l'affichage en fonction... et tous tes contenus seraient référencés dans la même table, ce qui te simplifierai la requête !

Ce n'est qu'une idée...

Edit : oui j'avoue, moi j'suis un peu plus bourrin que fab j'te fais tout péter mais j'aime bien :lol:

Re: Jointures de tables l'éternel problème ...

par fab » 22 oct. 2009, 13:59

un exemple de ? :p
Je viens de te donner la structure de la table :)

Re: Jointures de tables l'éternel problème ...

par visualight » 22 oct. 2009, 13:50

Hum, je pense que pour simplifier la chose j'aurais fait une autre table qui fait la jointure comme tu veux!
Elle contiendrait donc les champs suivants
- id
- gallery_id
- gallery_photo_id
- gallery_video_id

Comme ça tu fais une requete en testant si gallery_photo_id n'est pas null ou gallery_video_id n'est pas nul

Comment dois-je procéder ? Vous savez me donner un exemple ?

Re: Jointures de tables l'éternel problème ...

par fab » 22 oct. 2009, 13:43

Hum, je pense que pour simplifier la chose j'aurais fait une autre table qui fait la jointure comme tu veux!
Elle contiendrait donc les champs suivants
- id
- gallery_id
- gallery_photo_id
- gallery_video_id

Comme ça tu fais une requete en testant si gallery_photo_id n'est pas null ou gallery_video_id n'est pas nul

Re: Jointures de tables l'éternel problème ...

par visualight » 22 oct. 2009, 13:28

Le message d'erreur est clair pourtant, euh soit dit en passant pourquoi pas simplement faire 2 requetes ?
Je ne peux pas faire deux requetes car je dois avoir un seul output, une seule boucle while.
SELECT *
FROM
(SELECT $CfgTableMain.gallery_id as MonID, *
 FROM $CfgTableMain
       LEFT JOIN $CfgTablePhotos 
          ON $CfgTableMain.gallery_id = $CfgTablePhotos.gallery_id) as MaTable
LEFT JOIN $CfgTableVideos
    ON MaTable.MonID = $CfgTableVideos.gallery_id
Je viens de tester ce code mais une erreur survient me disant : Duplicate column name 'gallery_id'
En réponse à vos questions sur la structure de mes tables,

veuillez suivre le lien suivant : http://www.150.be/temp/

Le problème étant que si la structure de mes tables n'est pas bonne, je ne vois pas comment faire pour réaliser mon projet.
Pour moi ma structure est bonne et rentre dans la logique de conception d'un tel projet (gallerie photo video)

Au final, le problème reste entier:
1. la structure de table que j'ai choisi est elle bonne ?
2. Si oui, comment lier les id des tables photos ET/OU videos à la table principale

Le truc qui aurait pu marcher et qui pourrait vous donner des idées pour m'aider : L'utilisation de OR
Je pense que l'utilisation de OR dans le contexte d'une jointure aurait été parfait ( car à la base c'est AND)
// $max = LIMIT ... (pagination)
// table principale : $CfgTableMain | table2 : $CfgTablePhotos | table3 : $CfgTableVideos
$req_main="SELECT * FROM $CfgTableMain 
LEFT JOIN $CfgTablePhotos ON ($CfgTableMain.gallery_id = $CfgTablePhotos.gallery_id)
OR
LEFT JOIN $CfgTableVideos ON ($CfgTableMain.gallery_id = $CfgTableVideos.gallery_id)
GROUP BY $CfgTableMain.gallery_id ORDER BY $CfgTableMain.gallery_date DESC $max";

Franchement, je ne pensais pas qu'un simple problème (en réalité) pouvait me donner tant de fil a retordre.
Je suis bloqué là ... je ne sais pas quoi faire, ni comment

Une aide est franchement la bienvenue,

Merci pour tout,
Raph

Re: Jointures de tables l'éternel problème ...

par Kran » 22 oct. 2009, 09:24

Oui en effet, je n'ai point précisé que les deux select utilisés devaient avoir le même nombre de colonnes (in french in the text...)

Sinon tentes un truc dans ce gout la plutôt (tout en notant bien que je persiste à douter de tes choix structurels au niveau des tables...) :
SELECT *
FROM
(SELECT $CfgTableMain.gallery_id as MonID, *
 FROM $CfgTableMain
       LEFT JOIN $CfgTablePhotos 
          ON $CfgTableMain.gallery_id = $CfgTablePhotos.gallery_id) as MaTable
LEFT JOIN $CfgTableVideos
    ON MaTable.MonID = $CfgTableVideos.gallery_id
Mais je me permettrai également d'appuyer la question de fab... on de réappuyer une fois de plus mon gros doute (cf plus haut)... en gros, fab et moi on pense que tu t'fais des noeuds au cerveau pour rien ^^

Re: Jointures de tables l'éternel problème ...

par fab » 21 oct. 2009, 20:04

Le message d'erreur est clair pourtant, euh soit dit en passant pourquoi pas simplement faire 2 requetes ?

Re: Jointures de tables l'éternel problème ...

par visualight » 21 oct. 2009, 19:46

Qu'est-ce que ça donne sans le group by dans la requête ?

A+

Pascal
Sans le group by, il affiche tous les enregistrements de toutes les tables où l'iD est identique


Hello...

Ca doit pas être le plus propre qu'on puisse faire, mais au pire, je pense qu'une merdouille dans ce gout la devrait fonctionner dans a peu près tous les cas possibles et immaginables :
SELECT *
FROM $CfgTableMain
       LEFT JOIN $CfgTablePhotos 
          ON $CfgTableMain.gallery_id = $CfgTablePhotos.gallery_id
UNION
SELECT *
FROM $CfgTableMain
       LEFT JOIN $CfgTableVideos
          ON $CfgTableMain.gallery_id = $CfgTableVideos.gallery_id
Cependant, je me permet de douter amicalement de l'efficacité du dispatch des informations entre tes différentes tables... on peut voir les structures ?
J'ai essayé cette méthode mais cela me génère une erreur : The used SELECT statements have a different number of columns
$req_main="SELECT * FROM $CfgTableMain LEFT JOIN $CfgTablePhotos ON ($CfgTableMain.gallery_id = $CfgTablePhotos.gallery_id)
UNION
SELECT * FROM $CfgTableMain LEFT JOIN $CfgTableVideos ON ($CfgTableMain.gallery_id = $CfgTableVideos.gallery_id)";
Je suis dans la mouise. J'ai vu que c'était possible d'utiliser un FULL JOIN mais apparament ça ne fonctionne pas sous ma version mysql
Si au moins je pouvais tester avec UNION ... mais j'ai une erreur.

Re: Jointures de tables l'éternel problème ...

par Kran » 21 oct. 2009, 17:58

Hello...

Ca doit pas être le plus propre qu'on puisse faire, mais au pire, je pense qu'une merdouille dans ce gout la devrait fonctionner dans a peu près tous les cas possibles et immaginables :
SELECT *
FROM $CfgTableMain
       LEFT JOIN $CfgTablePhotos 
          ON $CfgTableMain.gallery_id = $CfgTablePhotos.gallery_id
UNION
SELECT *
FROM $CfgTableMain
       LEFT JOIN $CfgTableVideos
          ON $CfgTableMain.gallery_id = $CfgTableVideos.gallery_id
Cependant, je me permet de douter amicalement de l'efficacité du dispatch des informations entre tes différentes tables... on peut voir les structures ?

Re: Jointures de tables l'éternel problème ...

par pascaltje » 21 oct. 2009, 17:22

Qu'est-ce que ça donne sans le group by dans la requête ?

A+

Pascal

Jointures de tables l'éternel problème ...

par visualight » 21 oct. 2009, 14:04

Bonjour,

J'essaye en vain depuis quelques jours à réaliser une sorte de jointure de table (avec 3 tables: table_principale, table2 et table3) le tout basé sur un ID stocké dans la table_principale et répliqué, pour chaque enregistrements, dans la table2 et table3 (afin par la suite de faire correspondre les enregistrements de la table_principale avec ceux de table2 ET/OU table3). Ceci me permettant d'afficher un élément de la table_principale si l'élément existe dans la table2 ET/OU dans la table3.

Vous mes suivez ?

Exemple : table_principale contient l'id 1 et au moins un enregistrements de la table 2 ET/OU table 3 contient l'id 1 ==> On affiche l'élément.

L'id de la table_principale est Unique et autoincrémenté.
Les tables2 et 3 ont pour chaque enregistrements l'id répliquée de la table_principale.

Mon problème est qu'il m'est impossible d'obtenir l'id d'un enregistrement si il ne figure pas dans les 3 tables.
Ce que j'aimerai faire c'est afficher l'id d'un enregistrement si il existe dans la table2 ET/OU dans la table3



Voici ce que j'ai tenté de faire dans un premier jet : Jointure type LEFT :
// $max = LIMIT ... (pagination)
// table principale : $CfgTableMain | table2 : $CfgTablePhotos | table3 : $CfgTableVideos
$req_main="SELECT * FROM $CfgTableMain LEFT JOIN $CfgTablePhotos ON ($CfgTableMain.gallery_id = $CfgTablePhotos.gallery_id) 
LEFT JOIN $CfgTableVideos ON ($CfgTableMain.gallery_id = $CfgTableVideos.gallery_id)
GROUP BY $CfgTableMain.gallery_id ORDER BY $CfgTableMain.gallery_date DESC $max";

$res_main=mysql_query($req_main) or die(mysql_error()); 

while ($row = mysql_fetch_array ($res_main)) {
echo $row['gallery_id'];
}

Le souci avec ce code c'est que si l'ID n'existe pas dans la table photo, l'id ne s'affiche pas ...alors qu'il existe dans la table video et la table principale !
J'ai essayé RIGHT JOIN ET INNER mais cela ne semble pas fonctionner non plus.

Alors j'ai tenté une imbrication de requête ...
$req_main="SELECT * FROM $CfgTableMain LEFT JOIN $CfgTablePhotos ON ($CfgTableMain.gallery_id = $CfgTablePhotos.gallery_id) 
WHERE $CfgTableMain.gallery_id IN (SELECT * FROM $CfgTableVideos WHERE $CfgTableMain.gallery_id = $CfgTableVideos.gallery_id)
GROUP BY $CfgTableMain.gallery_id ORDER BY $CfgTableMain.gallery_date DESC $max";
Mais ça plante grave ...

Comment puis-je afficher l'ID d'un enregistrement si il existe dans la table photo (table2) ET/OU table video (table3) ?
(sachant que par défaut il existe et il est créé dans la table_principale)

A mon avis c'est une question de jointure mais je ne sais pas comment m'y prendre.

Meci pour votre aide,
Raph