目前我有 3 個表,第一個表“用戶”包含id和user_name. 第二個表 'listings' 包含refno和agent_id。我的第三個表“日志”包含refno和status。現在我想在他們的狀態旁邊顯示一個人的名字。所以基本上我想要來自日志的狀態條目的計數,并將它們各自的用戶名放在它旁邊。
為此,我必須將refno“日志”參考到refno“串列”,將agent_id“串列”參考到id“用戶”。為此,我使用了以下陳述句:
select SUM(CASE WHEN status = 'Draft' THEN 1 END) AS draft,
SUM(CASE WHEN status = 'Publish' THEN 1 END) AS publish,
u.name
from logs t
inner join listings l on t.refno = l.refno
inner join users u on l.agent_id=u.id
但這會回傳如下輸出:

這是錯誤的,我想要的輸出是這樣的:
| 草案 | 發布 | 姓名 |
|---|---|---|
| 1 | 1 | 杰森 |
| 0 | 1 | 果醬 |
我添加了一個帶有資料的 sqlfiddle 以使參考更容易理解:http ://sqlfiddle.com/#!9/22b6e4/5
uj5u.com熱心網友回復:
要克服的明顯問題是,您的串列表中有非唯一資料——這會影響您的總和。
您只需要在唯一的行上加入,這樣就不會對隨后加入的行進行多次計數。
SELECT u.id,
u.name,
SUM(status = 'Draft') AS draft,
SUM(status = 'Publish') AS publish
FROM users AS u
JOIN (SELECT DISTINCT * FROM listings) AS l ON u.id = l.agent_id
JOIN logs AS t ON l.refno = t.refno
GROUP BY u.id
我更喜歡在結果集中包含 id,因為名稱通常不是唯一的。
http://sqlfiddle.com/#!9/22b6e4/48
uj5u.com熱心網友回復:
更新:
根據您在下面的評論,您需要首先在FROM必須包含所有必要資料的子句中創建偽表,以獲得所需的結果。
下面的子查詢創建一個包含所有必需資料的偽表。
SELECT u.id,
u.name,
t.status,
t.refno
FROM logs t
INNER JOIN listings l ON t.refno = l.refno
INNER JOIN users u ON l.agent_id = u.id
GROUP BY t.refno, u.name, t.status;
您只需將上述查詢作為子查詢包裝在FROM原始查詢的子句中即可。
所以這是獲得所需輸出的最終查詢。
SELECT SUM(CASE WHEN tab.status = 'Draft' THEN 1 ELSE 0 END) AS draft,
SUM(CASE WHEN tab.status = 'Publish' THEN 1 ELSE 0 END) AS publish,
tab.name
FROM (SELECT u.id,
u.name,
t.status,
t.refno
FROM logs t
INNER JOIN listings l ON t.refno = l.refno
INNER JOIN users u ON l.agent_id = u.id
GROUP BY t.refno, u.name, t.status) AS tab
GROUP BY tab.name
ORDER BY tab.id;
原答案:
您需要添加一個GROUP BY子句以根據所需的引數對結果進行分組。
在這里,您可以按l.agent_id或分組u.id。
我注意到的另一件事是,您需要ELSE在SUM陳述句中添加一個子句以在查詢回傳0意外status情況時回傳。
像這樣的東西:
SUM(CASE WHEN status = 'Publish' THEN 1 ELSE 0 END)
所以你的最終查詢變成了這樣:
SELECT SUM(CASE WHEN status = 'Draft' THEN 1 ELSE 0 END) AS draft,
SUM(CASE WHEN status = 'Publish' THEN 1 ELSE 0 END) AS publish,
u.name
FROM logs t
INNER JOIN listings l ON t.refno = l.refno
INNER JOIN users u ON l.agent_id=u.id
GROUP BY u.id;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/315213.html
