2015-05-12 80 views
1

我有以下MySQL表:組合這三個SELECT語句是否可能並謹慎?

LEVEL(lid) USERS(uid,name,l_id) USERS_G(u_id,r_id,flag) REQUESTS(rid,status) 
--------------------------------------------------------------------------------- 
    1    1 John 1   1 96 1     96 0 
    2    2 Peter 1   1 97 1     97 0 
    3    3 Helen 2   2 97 0     98 0 
            3 97 0     99 1 
            2 98 1 
            1 98 0 
            3 98 0 

LEVEL給用戶1:N,USERS到USERS_G 1:N,請求USERS_G 1:N。

我想從具有一定狀態的請求中選擇那些記錄,同時這些請求的用戶持有者記錄具有一定的級別。認爲用戶是請求的支架如果USERS_G相應標誌等於1。這是相當容易和如下實施:

SELECT lid,rid,name FROM REQUESTS JOIN USERS_G 
     ON REQUESTS.rid = USERS_G.r_id AND flag=1 AND status='0' 
     JOIN USERS 
     ON USERS_G.u_id=USERS.uid 
     JOIN LEVEL 
     ON LEVEL.lid=USERS.l_id AND LEVEL.lid='1'; 

上述查詢的結果是:

1 96 John 
1 97 John 
1 98 Peter 

到現在爲止還挺好。此外,我想找到與以前的任何請求相關的記錄數。換句話說:

SELECT COUNT(*) FROM REQUESTS JOIN USERS_G 
     ON REQUESTS.rid = USERS_G.r_id 
     WHERE REQUESTS.status='0' GROUP BY REQUESTS.rid; 

1 
3 
3 

我還沒說完呢!我也想對應的名稱的字符串中:

SELECT GROUP_CONCAT(USERS.name SEPARATOR '\n') FROM USERS,USERS_G,REQUESTS 
WHERE uid=u_id AND r_id=rid AND status=0 GROUP BY rid; 

至於把事情有點更全面的我想要的結果如下 一個查詢?

Level  Rid Holder Name  Count  Concat 
--------------------------------------------------------------- 
1   96  John    1   John 
1   97  John    3   John Peter Helen 
1   98  Peter    3   John Peter Helen 

實現該目標是否可行?顯然這個查詢必須儘可能快地執行。

預先感謝您

+0

不壞的努力,但是,如果你喜歡,可以考慮下列行爲這個簡單的兩步過程:1.如果您還沒有這樣做,提供適當的DDL(和/或sqlfiddle),這樣我們可以更容易地複製問題。 2.如果您尚未這樣做,請提供與步驟1中提供的信息相對應的所需結果集。 – Strawberry

回答

1

最簡單的解決辦法是選擇顯示在所有3個查詢和聯合查詢的rid在一起。例如。是這樣的:

SELECT r.*, counts.count, names.concat 

FROM (
    SELECT lid,rid,name FROM REQUESTS JOIN USERS_G 
     ON REQUESTS.rid = USERS_G.r_id AND flag=1 AND status='0' 
     JOIN USERS 
     ON USERS_G.u_id=USERS.uid 
     JOIN LEVEL 
     ON LEVEL.lid=USERS.l_id AND LEVEL.lid='1' 
    ) AS r 
JOIN (
    SELECT rid, COUNT(*) as count FROM REQUESTS JOIN USERS_G 
     ON REQUESTS.rid = USERS_G.r_id 
     WHERE REQUESTS.status='0' GROUP BY REQUESTS.rid 
    ) AS counts ON counts.rid = r.rid 
JOIN (
    SELECT rid, GROUP_CONCAT(USERS.name SEPARATOR '\n') AS concat FROM USERS,USERS_G,REQUESTS 
    WHERE uid=u_id AND r_id=rid AND status=0 GROUP BY rid; 
    ) AS names ON names.rid = r.rid 
相關問題