2017-03-04 51 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 –