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
實現該目標是否可行?顯然這個查詢必須儘可能快地執行。
預先感謝您
不壞的努力,但是,如果你喜歡,可以考慮下列行爲這個簡單的兩步過程:1.如果您還沒有這樣做,提供適當的DDL(和/或sqlfiddle),這樣我們可以更容易地複製問題。 2.如果您尚未這樣做,請提供與步驟1中提供的信息相對應的所需結果集。 – Strawberry