我有3个SELECT语句,我想组合成一个:
SELECT COUNT(A.id), CONCAT(B.fname,' ', B.lname) AS fullname
FROM feedbacks A
INNER JOIN users B
ON A.userid = B.userid
WHERE DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11'
GROUP BY fullname
SELECT COUNT(A.id), CONCAT(B.fname,' ', B.lname) AS fullname
FROM feedbacks A
INNER JOIN users B
ON A.userid = B.userid
WHERE status = 'C'
AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11'
GROUP BY fullname`
SELECT COUNT(A.id), CONCAT(B.fname,' ', B.lname) AS fullname
FROM feedbacks A
INNER JOIN users B ON A.userid = B.userid
WHERE caused_change = 1
AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11'
GROUP BY fullname
但是将它们组合似乎总是会返回错误:(操作数应该包含1列)
SELECT
(SELECT COUNT(A.id), CONCAT(B.fname,' ', B.lname) AS fullname FROM feedbacks A INNER JOIN users B ON A.userid = B.userid WHERE DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' GROUP BY fullname) AS T1,
(SELECT COUNT(A.id), CONCAT(B.fname,' ', B.lname) AS fullname FROM feedbacks A INNER JOIN users B ON A.userid = B.userid WHERE status = 'C' AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' GROUP BY fullname) AS T2,
(SELECT COUNT(A.id), CONCAT(B.fname,' ', B.lname) AS fullname FROM feedbacks A INNER JOIN users B ON A.userid = B.userid WHERE caused_change = 1 AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' GROUP BY fullname) AS T3
所以我尝试从各个语句中删除JOIN和GROUP来制作:
SELECT CONCAT(B.fname, ' ', B.lname) AS fullname,
(SELECT COUNT(A.id) FROM feedbacks A WHERE DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11') AS T1,
(SELECT COUNT(A.id) FROM feedbacks A WHERE status = 'C' AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11') AS T2,
(SELECT COUNT(A.id) FROM feedbacks A WHERE caused_change = 1 AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11') AS T3
FROM feedbacks
INNER JOIN users B
ON feedbacks.userid = B.userid
GROUP BY fullname
但是这会返回所有内容的总数而不是用户分解(因为计数在where子句中没有说明有关userid或fullname的内容,毫无疑问)。
我觉得我很亲密,但却缺少一些东西。谁能指出我在这里的正确方向?我只是想了解我做错了什么。
感谢您的时间。
答案 0 :(得分:8)
最好的方法是使用条件SUM
:
SELECT CONCAT(B.fname, ' ', B.lname) AS fullname,
SUM(
CASE WHEN DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11'
THEN 1 ELSE 0 END
) AS T1,
SUM(
CASE WHEN status = 'C'
AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11'
THEN 1 ELSE 0 END
) AS T2,
SUM(
CASE WHEN caused_change = 1
AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11'
THEN 1 ELSE 0 END
) AS T3
FROM feedbacks
INNER JOIN users B
ON feedbacks.userid = B.userid
GROUP BY fullname
答案 1 :(得分:0)
我不知道您是否可以将这3个查询合并为一个统一查询。你有3'的子句重叠:
第一个查询:属于日期范围的所有记录
第二个查询:属于日期范围但状态='C'的所有记录
第三个查询:属于日期范围的所有记录,但也包含cause_change = 1
在逻辑上,第一个查询已包含第二个和第三个查询中的所有记录,因此您需要重复计算#2和#3的结果。
但是,如果您确实希望将所有三个结合到一个结果中,那么请执行外部查询方法:
SELECT sum(cnt), fullname
FROM (
SELECT COUNT(A.id) as cnt, CONCAT(B.fname,' ', B.lname) AS fullname
FROM feedbacks A
INNER JOIN users B ON A.userid = B.userid
WHERE DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11'
GROUP BY fullname
UNION
...
WHERE status = 'C' AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11'
UNION
...
WHERE caused_change = 1 AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11'
) AS innerquery
GROUP BY fullname
请注意第一个内部查询中count()
上的别名。这是为了使计数字段显示为外部查询的“cnt”。
答案 2 :(得分:0)
UNION和SUM应该做的工作。您的代码应如下所示:
select sum(x.col1), x.fullname
from
(SELECT COUNT(A.id)as col1, CONCAT(B.fname,' ', B.lname) AS fullname FROM feedbacks A INNER JOIN users B ON A.userid = B.userid WHERE DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' GROUP BY fullname
UNION
SELECT COUNT(A.id)as col1, CONCAT(B.fname,' ', B.lname) AS fullname FROM feedbacks A INNER JOIN users B ON A.userid = B.userid WHERE status = 'C' AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' GROUP BY fullname
UNION
SELECT COUNT(A.id)as col1, CONCAT(B.fname,' ', B.lname) AS fullname FROM feedbacks A INNER JOIN users B ON A.userid = B.userid WHERE caused_change = 1 AND DATE(origindate) BETWEEN '2011-03-01' AND '2011-07-11' GROUP BY fullname
)x
group by x.fullname