2016-06-08 22 views
0

我的架構是多參加在同一個表

CREATE TABLE IF NOT EXISTS `account` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(120) NOT NULL, 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE IF NOT EXISTS `reseller_did` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `phone` int(11) NOT NULL, 
    `superadmin_id` int(11) NOT NULL DEFAULT '0', 
    `reseller_id` int(11) NOT NULL DEFAULT '0', 
    `admin_id` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    FOREIGN KEY (`superadmin_id`) REFERENCES account(`id`), 
    FOREIGN KEY (`reseller_id`) REFERENCES account(`id`), 
    FOREIGN KEY (`admin_id`) REFERENCES account(`id`) 
) 

我想找到手機與他們的超級管理員,經銷商,管理員名稱。問題是我無法多次加入同一個ID。查詢我試圖

select phone,superadmin_id,reseller_id, admin_id, name from reseller_did join 
account on account.id=reseller_did.admin_id 

上面的查詢通過連接在admin_id但如何獲得超級管理員的名稱和相同的手機經銷商名稱顯示管理員的名字嗎?

編輯:採樣輸入

帳戶表

id  name 

3  SuperAdmin1 
9  Reseller1 
10  Admin1 

reseller_did

id phone  superadmin_id reseller_id admin_id 

1 9090909090 3     9    10 

樣本輸出

phone  superadmin reseller admin 

9090909090 SuperAdmin1 Reseller1 Admin1 
+1

請發佈一些示例輸入和您的預期輸出。 – 1000111

+0

@ 1000111我的錯誤,更新了問題 – codegasmer

+0

與post [通過不同關係從另一個表中獲取多個值]類似(http://stackoverflow.com/questions/37674462/get-multiple-values-from-another-table-by - 不同-關係/ 37674633#37674633) –

回答

1

試試這個;)

select r.phone, a.name as admin, re.name reseller, s.name as superadmin 
from reseller_did r 
join account a on a.id = r.admin_id 
join account s on s.id = r.superadmin_id 
join account re on re.id = r.reseller_id 

SqlFiddle Result

或者

SELECT r.phone, 
     MAX(CASE WHEN a.id = r.admin_id THEN a.name END) as admin, 
     MAX(CASE WHEN a.id = r.reseller_id THEN a.name END) as reseller, 
     MAX(CASE WHEN a.id = r.superadmin_id THEN a.name END) as superadmin 
FROM reseller_did r 
INNER JOIN account a 
ON a.id IN (r.admin_id, r.superadmin_id, r.reseller_id) 
GROUP BY r.phone 

這個SQL應該感謝到@sagi在這個問題上Get multiple values from another table by different relations

SqlFiddle Result

0

希望這個作品

select 
    rd.phone as Phone , 
    a.name as Superadmin, 
    a1.name as Reseller, 
    account.name as Admin 
from 
    reseller_did rd 
     join 
    account ON account.id = rd.admin_id 
     join 
    account a ON a.id = rd.superadmin_id 
     join 
    account a1 ON a1.id = rd.reseller_id 
0

您可以account表中的三個別名和INNER JOIN這些與reseller_did

SELECT 
R.id, 
R.phone, 
A1.name AS superadmin, 
A2.name AS reseller, 
A3.name AS admin 
FROM reseller_did R 
INNER JOIN account A1 ON R.superadmin_id = A1.id 
INNER JOIN account A2 ON R.reseller_id = A2.id 
INNER JOIN account A3 ON R.admin_id = A3.id ; 

SQL FIDDLE DEMO 1

備選方法:

如果您不想採用INNER JOIN,則可以使用以下查詢獲取相同的結果。

SELECT 
R.phone, 
(SELECT name FROM account WHERE id = R.superadmin_id) AS SuperAdmin, 
(SELECT name FROM account WHERE id = R.reseller_id) AS Reseller, 
(SELECT name FROM account WHERE id = R.admin_id) AS Admin 
FROM reseller_did R; 

SQL FIDDLE DEMO 2

注意:您存儲在INT數據類型的電話號碼。您不應使用INT來存儲電話號碼。相反,你應該使用VARCHAR