我有一个问题,
SELECT E.staffid AS staff
SUM(E.Frequency='Less') AS lessCount,
SUM(E.Frequency='More') AS moreCount,
FROM effort_frequency E
INNER JOIN ost_staff S ON S.staff_id = E.staffid
WHERE E.log_date BETWEEN '2012-05-01' AND '2012-05-23'
GROUP BY E.staffid
我得到下表,
+-------+-----------+-----------+
| Staff | lessCount | moreCount |
+-------+-----------+-----------+
| 1 | 2 | 3 |
| 3 | 1 | 4 |
| 5 | 2 | 3 |
+-------+-----------+-----------+
您可以看到结果中缺少 2 和 4,在给定日期的 effort_frequency
表中将没有 staff_id 为 2 和 4 的行,但我正在尝试加入 ost_staff
表,这样我就可以获得类似下表的内容,ost_staff 将包含所有员工 ID,比方说 1-5。
+-------+-----------+-----------+
| Staff | lessCount | moreCount |
+-------+-----------+-----------+
| 1 | 2 | 3 |
| 2 | 0 | 0 |
| 3 | 1 | 4 |
| 4 | 0 | 0 |
| 5 | 2 | 3 |
+-------+-----------+-----------+
我尝试了外部连接但它不起作用,我想我在某个地方犯了错误。
最佳答案
将WHERE
子句移动到ON
子句,并将INNER JOIN
更改为RIGHT JOIN
。并将 GROUP BY E.staffid
更改为 GROUP BY S.staff_id
;同样 SELECT E.staffid,
将其更改为 SELECT s.staff_id
:
SELECT S.staff_id AS staff
COALESCE(SUM(E.Frequency='Less'),0) AS lessCount,
COALESCE(SUM(E.Frequency='More'),0) AS moreCount,
FROM effort_frequency E
RIGHT JOIN ost_staff S
ON S.staff_id = E.staffid
AND E.log_date BETWEEN '2012-05-01' AND '2012-05-23'
GROUP BY S.staff_id
如果要使用LEFT JOIN
,请切换表 ost_staff 和 effort_frequency:
SELECT S.staff_id AS staff
COALESCE(SUM(E.Frequency='Less'),0) AS lessCount,
COALESCE(SUM(E.Frequency='More'),0) AS moreCount,
FROM ost_staff S
LEFT JOIN effort_frequency E
ON S.staff_id = E.staffid
AND E.log_date BETWEEN '2012-05-01' AND '2012-05-23'
GROUP BY s.staff_id
您也可以使用 IFNULL 代替 COALESCE。尽管 IFNULL 仅适用于 MySQL
关于mysql - Joins中的疑惑——MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10713816/