[RESOLU] JOIN Plusieurs colonne sur une seule colonne d'une table

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 : [RESOLU] JOIN Plusieurs colonne sur une seule colonne d'une table

Re: JOIN Plusieurs colonne sur une seule colonne d'une table

par Stevenhonor » 21 mai 2020, 15:07


Après si tu veux vraiment te limiter à une ligne par relations tu peux aussi faire simplement 2 requêtes. Une première pour récupérer tous les ids des amis et une deuxième pour récupérer leurs informations. C'est bien de faire attention, d'optimiser son code mais c'est bien de rester simple aussi. 2 requêtes au lieu de 1 ça fait vraiment pas une grosse différence.

D'ailleurs pour moi le where il est pas bon, à vérifier mais :
WHERE ID_Ami1 OR ID_Ami2 = ?
// est différent de
WHERE ID_Ami1 = ? OR ID_Ami2 = ?
et je pense que tu perds potentiellement des lignes avec la première syntaxe.
Je viens seulement de voir ton édit et oui je suis totalement d'accord avec toi: la syntaxe n'était pas bonne dans mon WHERE lorsque je l'ai posté ici. Mais ce n'est pas grave parce que j'ai décidé de laisser tomber la simplification et de garder les deux entrées dans la base de données pour chaque ami.

Re: JOIN Plusieurs colonne sur une seule colonne d'une table

par Stevenhonor » 20 mai 2020, 23:21

D'accord ! ^^
Oui, je pensais aussi changer les noms de table et de colonnes pour que ce soit un peu plus clair déjà de base ;)

Merci à toi, Saian ! :)

Re: JOIN Plusieurs colonne sur une seule colonne d'une table

par Saian » 20 mai 2020, 23:12

Techniquement oui elle va être deux fois plus lourde mais avec 2 id par ligne va en falloir des lignes pour que la table soit lourde.

Tu peux considérer les colonnes de la table de liaison comme ça si tu veux donner un peu plus de sens au fait de doubler les lignes :
AmiDe
- id
- membre_id
- ami_id

Après si tu veux vraiment te limiter à une ligne par relations tu peux aussi faire simplement 2 requêtes. Une première pour récupérer tous les ids des amis et une deuxième pour récupérer leurs informations. C'est bien de faire attention, d'optimiser son code mais c'est bien de rester simple aussi. 2 requêtes au lieu de 1 ça fait vraiment pas une grosse différence.

D'ailleurs pour moi le where il est pas bon, à vérifier mais :
WHERE ID_Ami1 OR ID_Ami2 = ?
// est différent de
WHERE ID_Ami1 = ? OR ID_Ami2 = ?
et je pense que tu perds potentiellement des lignes avec la première syntaxe.

Re: JOIN Plusieurs colonne sur une seule colonne d'une table

par Stevenhonor » 20 mai 2020, 22:40

Donc ma solution de secours est la bonne d'après ce que tu dis?
Mais je ne sais pas trop parce que personnellement je trouve que ça ne fais pas super pro d'avoir deux fois une même ligne dans une base de données avec juste du contenu inverser...
Lorsque je rédige du code et que je réfléchis à la façon de créer les choses, j'essaye toujours de prévoir les futurs problèmes éventuels et cette option pose un problème sur la taille de la table à longs termes. Avoir deux lignes est beaucoup plus gourmand en ressource que de n'en avoir qu'une seule, non ?

Re: JOIN Plusieurs colonne sur une seule colonne d'une table

par Saian » 20 mai 2020, 22:22

Bonsoir Stevenhonor, à mon sens pour faire ce que tu veux (récupérer toutes les infos en une requête), avoir les lignes en "double" (avec ids inversées) est une bonne solution.

JOIN Plusieurs colonne sur une seule colonne d'une table

par Stevenhonor » 20 mai 2020, 19:41

Bonsoir (ou bonjour) à tous !

Je suis actuellement bloqué sur une requête SQL que je n'arrive pas à faire fonctionner à 100% comme je le souhaite.
Sur une page, je veux récupérer la liste des amis de l'utilisateur.
J'ai une table "Liste_Amis" qui s'organise comme ceci:

ID ( Pour la clé primaire ) / ID_Ami1 / ID_Ami2 / DateAjout / HeureAjout.

J'ai une table Membres où je récupère l'ID_Ami pour y faire un simple join et y récupérer des informations sur son compte ( Pseudo, Rang, etc ... ).

Ma requête SQL ressemble donc à ça:
$reqfriends = $bdd->prepare('SELECT * FROM Liste_Amis JOIN Membres ON Liste_Amis.ID_Ami2 = Membres.ID_Utilisateur WHERE ID_Ami1 OR ID_Ami2 = ?');
$reqfriends->execute(array($user['ID_Utilisateur']));
Seulement voilà, avec ce code, ça marche bien du coté d'un utilisateur mais pas de l'autre.
Sur l'autre, ce sont les informations de l'utilisateur qui affiche la page qui sont affichés.
Je sais que le problème vient de mon JOIN, et j'ai essayer plusieurs chose dont entre autre ceci et sous plusieurs syntaxe différentes mais la requête me retourne toujours un résultat nul à chaque fois:
$reqfriends = $bdd->prepare('SELECT * FROM Liste_Amis JOIN Membres ON Liste_Amis.ID_Ami2 = Membres.ID_Utilisateur JOIN Membres ON Liste_Amis.ID_Ami1 = Membres.ID_Utilisateur WHERE ID_Ami1 OR ID_Ami2 = ?');
$reqfriends->execute(array($user['ID_Utilisateur']));
J'ai trouvé un système de secours mais qui implique d'avoir deux fois la même entrée avec les ID_Ami1 et ID_Ami2 qui sont inverser et où je fais une simple requête ('SELECT * FROM Liste_Amis JOIN Membres ON_Liste_Amis.ID_Ami1 = Membres.ID_Utilisateur WHERE ID_Ami1 = ?) et un Execute avec comme seul paramètre l'ID de l'utilisateur qui affiche la page.
Mais vu que ce système demande d'avoir deux entrées dans la table Liste_Amis pour les deux même utilisateurs c'est pas très très sérieux....

Merci à ceux qui prendront de leur temps pour m'aider ! :)