2017-03-04 157 views
0

我有一个系统,所有的用户都存储在同一个表中,他们的“角色”决定了他们是什么类型的用户。MySQL INNER JOIN在同一张表上

顾客在商店赚取积分。我正在尝试创建一个PHP页面,客户可以在其中看到哪些商店获得了积分,因此商店可以登录并查看哪些客户获得了积分。 (希望是有道理的!)

我有两个表

表1是用户表,并包含所有用户的信息..即姓名,地址等

表2存储所有的点和uid(这是客户ID)和SID(这是商店ID),这两个字段都与用户表中的uid相匹配。

的sooo ....

我认为MySQL的需要看起来像这样

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 

这不起作用(显然,因为有非唯一表)。我对如何解决这个问题非常困惑!

在SQL结束,我将会把where子句

WHERE users.id=x 

用户ID可以是一个商店或客户,它会显示他们获得的点,显示Store /客户名称而不是ID。

希望有道理!

感谢

迈克尔

+0

请参阅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

回答

0

您可以使用left join,如:

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

基于由u1.*u2.*返回的值,你可以检查它是否是一个商店或客户与显示的值因此。

+0

非常感谢你!这是一个更好的方式! –

+0

我希望你不介意,但我有一点后续问题,查询返回的所有字段是伟大的,但因为我对相同的表匹配相同的字段名称出现...我怎么“解决”第二个领域。我原以为它会是u1.first_name和u2.first_name,但这似乎不起作用。 –

+0

你可以使用'u1.address AS“customer_address”,u2.address AS“store_address”'等,而不是使用'u1。*' –

0

使用这样的语法查询客户一定店

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 

您需要获得店铺,为顾客不同的等效查询。您不能对两个功能使用相同的查询。

+0

Darshan的回答指出我的方向正确,幸运的是在php页面我有能力查看哪个角色分配给用户,然后可以使用两个不同的SQL语句,一个基于lt.id和lt.uid –