我是 sql 新手,我想知道为什么在我将 sql 查询创建到 View 中时会出错
mysql查询:
SELECT staffid AS staff,
(SELECT count( feedback )FROM msqueue WHERE staffid = staff AND feedback =1) AS a,
(SELECT count( feedback )FROM msqueue WHERE staffid = staff AND feedback =2) AS b,
(SELECT count( feedback )FROM msqueue WHERE staffid = staff AND feedback =3) AS c,
(SELECT count( feedback )FROM msqueue WHERE staffid = staff AND feedback =4) AS d
FROM msqueue
GROUP BY staffid
这个查询结果就是我想要的
|staff| a | b | c | d |
|d1111| 0 | 1 | 1 | 0 |
|d1234| 1 | 2 | 4 | 0 |
但是当我创建查询作为 View 时 结果是
|staff| a | b | c | d |
|d1111| 1 | 3 | 5 | 0 |
|d1234| 1 | 3 | 5 | 0 |
请帮我看看这段代码是怎么回事..非常感谢
最佳答案
尝试
SELECT staffid AS staff,
(SELECT count(*) FROM msqueue n WHERE n.staffid = m.staffid AND feedback =1) AS a,
(SELECT count(*) FROM msqueue n WHERE n.staffid = m.staffid AND feedback =2) AS b,
(SELECT count(*) FROM msqueue n WHERE n.staffid = m.staffid AND feedback =3) AS c,
(SELECT count(*) FROM msqueue n WHERE n.staffid = m.staffid AND feedback =4) AS d
FROM msqueue m
GROUP BY staffid
在您的原始查询中,您使用主选择的列 staffid
的别名将其与子查询的 staffid
列配对。这不足以区分两列,因此您得到了每一行所有内容的总和。通过在列名前面使用表别名 m
和 n
我们现在可以清楚地解决这两个问题
列。
参见此处:http://sqlfiddle.com/#!9/ab25a9/1
您甚至可以在子查询中省略表别名,例如
SELECT staffid AS staff,
(SELECT count(*) FROM msqueue WHERE staffid = m.staffid AND feedback =1) AS a,
(SELECT count(*) FROM msqueue WHERE staffid = m.staffid AND feedback =2) AS b,
(SELECT count(*) FROM msqueue WHERE staffid = m.staffid AND feedback =3) AS c,
(SELECT count(*) FROM msqueue WHERE staffid = m.staffid AND feedback =4) AS d
FROM msqueue m
GROUP BY staffid
http://sqlfiddle.com/#!9/ab25a9/2
编辑
在我这边的所有这些“聪明的嘴”之后,我才发现,你原来的陈述是有效的——至少“靠它自己”(http://sqlfiddle.com/#!9/ab25a9/4)。我还没有尝试将其放在 View 中。也许这就是事情开始出错的时候。更安全的选择肯定是使用表别名。
是的,当您将它放在 View 中时,它确实出错了!但是至少有一个外部查询的表别名一切正常:http://sqlfiddle.com/#!9/f5f1e/1
我首先使用 MySql 对其进行了测试,但语句是相同的,并且在 SQL-Server 中也同样有效,请参见此处 http://sqlfiddle.com/#!6/f5f1e/1
关于mysql - 转换成 View 时sql参数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31011622/