上一个问题linky:MySQL Left Joins
非常友善,我们得到了以下代码:
select
JustACME.Name,
JustACME.NameCount,
COALESCE( COUNT( * ), 0 ) as CountFromResultsTable
from
( select a.Name,
count(*) as NameCount
from
acme a
group by
a.Name ) JustACME
LEFT JOIN results r
on JustACME.Name = r.Name
group by
JustACME.Name
上述代码完全按照我们的需要运行,并带回以下内容
Name Count Total
Tom 10 5
Bon 9 4
除了acme
和results
表中的信息之外,我们还需要提供更多信息。 '结果'表格如下:
Name q1
Tom 1
Tom 2
Tom 1
Bob 3
Bob 2
Bob 1
Bob 2
我想添加到此查询中,在名为results
的高音中,还有另一个名为q1
的字段。这可以有一个数字,1,2或3 - 我想做的是恢复每个Name
的1,2或3出现(计数)的次数也出现在表格中。有意义吗?
基本上,查询的输出应该是这样的:
Name Count Total q1 = 1 q1 = 2 q1 = 3
Bob 9 4 1 2 1
Tom 10 5 4 1 0
我可能会在这里走出困境,但可以做到吗?
提前致谢,
小时。
答案 0 :(得分:2)
要仅从Name, q1=1, q1=2, q1=3
获取results
表格,您只能使用:
SELECT Name,
COUNT(IF(q1=1,1,NULL)) as q1is1,
COUNT(IF(q1=2,1,NULL)) as q1is2,
COUNT(IF(q1=3,1,NULL)) as q1is3
FROM results
GROUP BY Name
这会计算每个结果的出现次数(每个名称) - 这是有效的,因为您只需要三个额外的列,并且知道您希望有哪些列的q1值。 (如果说有50万q1值,除了写出COUNT(IF(q1=i,1,0)) AS q1isi
50万次之外,没有办法在MySQL中做到这一点 - 不完全理想。)
要与之前的查询结合使用,可能会这样(将其添加为JOIN
):
select
JustACME.Name,
JustACME.NameCount,
COALESCE( COUNT( * ), 0 ) as CountFromResultsTable,
r2.q1is1, r2.q1is2, r2.q1is3 -- <-- grab those extra rows
from
( select a.Name,
count(*) as NameCount
from
acme a
group by
a.Name ) JustACME
LEFT JOIN results r
on JustACME.Name = r.Name
LEFT JOIN (SELECT Name, -- <-- add the new table in
COUNT(IF(q1=1,1,NULL)) as q1is1,
COUNT(IF(q1=2,1,NULL)) as q1is2,
COUNT(IF(q1=3,1,NULL)) as q1is3
FROM results
GROUP BY Name) r2
ON JustACME.Name = r2.Name
group by
JustACME.Name
事实上,我确信有一种方法可以在不需要LEFT JOIN
子查询的情况下执行此操作,但我的mysql kung fu已经用完了:P