假設我想找出 Jim Sullivan 和 Anna Schimdt 的 2 名員工共同完成的專案數量。我們有 3 桌員工,工人,專案。
雇員
| 員工ID | 姓名 |
|---|---|
| 110 | 吉姆·沙利文 |
| 111 | 安娜施密特 |
| 112 | 詹姆斯·李 |
沃克森
| 投影 | 員工ID |
|---|---|
| 6554 | 110 |
| 6554 | 111 |
| 6555 | 110 |
| 6555 | 111 |
| 6556 | 110 |
| 6556 | 111 |
| 6556 | 112 |
專案
| 投影 | 專案名 |
|---|---|
| 6556 | 持久性有機污染物 |
| 6555 | 嬰兒 |
| 6554 | 媽媽 |
從資料樣本來看,Jim Sullivan 和 Anna Schimdt 一起完成了 3 個專案。因此預期的結果應該是 3。我的代碼由于某種原因沒有顯示任何結果。這是我的代碼:
SELECT COUNT(w.employeeid)
FROM workson w
JOIN employees e ON e.employeeid = w.employeeid
JOIN projects p ON p.projectid = w.projectid
WHERE name LIKE 'jim%sullivan%'
AND name LIKE 'anna%schmidt%';
出于某種原因,如果我只過濾掉一名員工,代碼就可以作業,但是一旦我將他們兩個都包括在內,它就不起作用了。例如,如果我只有 Anna Schmidt,那么結果會出來,但只要我添加 AND 運算子,它就不起作用了。它確實適用于 OR 運算子
uj5u.com熱心網友回復:
這將顯示 Jim 從事的專案:
SELECT
p.projectid,
p.projectName
FROM Projects p
INNER JOIN Workson w ON w.projectid = p.projectid
INNER JOIN employees e ON e.employeeid = w.employeeid
WHERE e.name LIKE 'jim%sullivan%'
當您需要共享 2 個作品的專案時,您可以執行以下操作:
SELECT
p.projectid,
p.projectName
FROM Projects p
INNER JOIN Workson w1 ON w1.projectid = p.projectid
INNER JOIN Workson w2 ON w2.projectid = p.projectid
INNER JOIN Employees e1 ON e1.employeeid = w1.employeeid
INNER JOIN Employees e2 ON e2.employeeid = w2.employeeid
WHERE e1.name LIKE 'jim%sullivan%'
AND e2.name LIKE 'anna%schmidt%';
編輯:我忘記了一個 JOIN,現在它可以作業了,請參閱:DBFIDDLE
uj5u.com熱心網友回復:
使用此查詢:
SELECT w.projectid
FROM Workson w INNER JOIN Employees e
ON e.employeeid = w.employeeid
WHERE (e.name LIKE 'jim%sullivan%') OR (e.name LIKE 'anna%schmidt%')
GROUP BY w.projectid
HAVING COUNT(*) = 2;
你會得到projectidJim Sullivan 和 Anna Schimdt(或 Schmidt)一起作業的所有 s。
我不知道你為什么使用運算子LIKE而不是運算子=來比較列name與員工的姓名,所以我保持原樣,但是如果有另一個名為“Annabelle Schmidt”的員工,這會導致問題.
使用上述查詢作為子查詢來計算行數:
SELECT COUNT(*) count
FROM (
SELECT w.projectid
FROM Workson w INNER JOIN Employees e
ON e.employeeid = w.employeeid
WHERE (e.name LIKE 'jim%sullivan%') OR (e.name LIKE 'anna%schmidt%')
GROUP BY w.projectid
HAVING COUNT(*) = 2
) t;
或者,對于 MySql 8.0 使用COUNT()視窗函式:
SELECT DISTINCT COUNT(*) OVER () count
FROM Workson w INNER JOIN Employees e
ON e.employeeid = w.employeeid
WHERE (e.name LIKE 'jim%sullivan%') OR (e.name LIKE 'anna%schmidt%')
GROUP BY w.projectid
HAVING COUNT(*) = 2;
請參閱演示。
Projects不需要該表。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/438311.html
上一篇:ForLoop計數不正確
下一篇:將所選術語的ID回傳到陣列
