2017-03-04 2 views
0

J'ai un système où tous les utilisateurs sont stockés dans la même table et leur "rôle" décide quel type d'utilisateur ils sont.MySQL INNER JOIN sur les mêmes tables

Les clients gagnent des points dans les magasins. J'essaye de créer une page de PHP où le client peut voir quel magasin ils ont gagné leurs points et ainsi les magasins peuvent se connecter et voir quels clients ont gagné des points. (Hope qui est logique!)

J'ai deux tables

Tableau 1 est la table d'utilisateur et contient toutes les informations utilisateur dans ce .. nom, adresse, etc

magasins Table2 tous les points et l'uid (qui est l'ID du client) et le SID (qui est l'identifiant du magasin) ces deux champs correspondent à l'uid dans la table des utilisateurs.

sooo ....

Je pense que le MySQL doit ressembler à ceci

Select loyal_tokens.tokens, loyal_tokens.date, users.id, users.email, users.first_name, users.last_name,loyal_tokens.sid,loyal_tokens.uid from users, loyal_tokens 
INNER JOIN loyal_tokens, users as StoresName on users.id = loyal_tokens.sid 
INNER JOIN loyal_tokens, users as UsersName on users.id = loyal_tokens.uid 

Cela ne fonctionne pas (évidemment comme il y a des tables non uniques). Je suis vraiment à une perte sur la façon de le réparer!

A la fin de l'instruction SQL, je vais mettre une clause where

WHERE users.id=x 

L'ID utilisateur peut être soit un magasin ou un client et il affichera les points qu'ils ont gagnés et afficher le magasin/nom du client plutôt que l'ID.

Espérons que cela a du sens!

Merci

Michael

+0

Voir http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple- sql-query – Strawberry

Répondre

0

Vous pouvez utiliser left join, par exemple:

SELECT lt.*, u1.*, u2.* 
FROM loyal_tokens lt LEFT JOIN users u1 ON lt.uid = u1.id 
LEFT JOIN users u2 ON lt.sid = u2.id 
WHERE lt.sid = ? OR lt.uid = ? 

Sur la base des valeurs renvoyées par u1.* et u2.*, vous pouvez vérifier si elle est un magasin ou d'un client et afficher les valeurs en conséquence.

+0

Merci beaucoup! C'est une bien meilleure façon de le faire! –

+0

J'espère que cela ne vous dérange pas, mais j'ai un peu une question de suivi, la requête renvoie tous les champs ce qui est génial, mais parce que je fais correspondre les mêmes tables les mêmes noms de champ apparaissent ... comment puis-je "adresse" le deuxième champ. J'aurais pensé que cela aurait été u1.first_name et u2.first_name, mais cela ne semble pas fonctionner. –

+0

Vous pouvez utiliser 'u1.address AS" adresse_du_client ", u2.adresse AS" adresse_du_stockage "etc, au lieu d'utiliser" u1. * ' –

0

Utilisez une syntaxe comme celui-ci pour effectuer des requêtes les clients pour un certain magasin

Select 
    loyal_tokens.tokens, loyal_tokens.date, 
    customer.last_name, customer.first_name 
from loyal_tokens 
    left join users as customer on customer.id = loyal_tokens.uid 
where loyal_tokens.sid = 1234 

Vous avez besoin d'une autre requête équivalente pour obtenir les magasins pour un client. Vous ne pouvez pas utiliser la même requête pour les deux fonctionnalités.

+0

La réponse de Darshan m'a indiqué dans la bonne direction, heureusement sur la page php j'ai la possibilité pour voir quel rôle est assigné à l'utilisateur, puis utiliser deux instructions SQL différentes, l'une est basée sur lt.sid et l'autre sur lt.uid –