我是一个mysql新手,最近安装了mariadb来处理一个项目。我有一个包含许多项目的表,这些项目分为不同的类别(catnum),还有一个表status,显示项目(按id#)及其当前状态(a或b)。我需要编写一个查询,列出所有类别(按catnum)以及每个类别中所有a和b的总和,如下所示:
期望结果:
catnum statA statB
1001 22 15
1002 0 12
1003 14 8
1004 3 37
1005 24 0
1006 0 1
1007 47 5
etc
items表如下所示:
itemid catnum
1 1205
2 1008
3 1010
4 1150
5 1782
6 1553
7 1004
etc
状态表如下所示:
itemid stat
60 A
302 A
95 B
122 B
8 B
6 A
46 B
etc
items中的itemid是自动递增的,以备不时之需。我知道(或认为我知道)我需要结合使用以下内容:
count(status.stat) or count(status.stat = A)
where items.itemid = status.itemid
where stat = A (then B)
group by catnum.
在某些组合中,尽管存在“unknown column”status.itemid“in'having clause”或其他子句,但仍会出现错误。为什么?我最近得到的是显示每个类别和两个状态列正确标记,但b状态项的数量是不正确的,只是重复了a状态项的数量。
SELECT
items.catnum,
count(status.stat=1) AS statA,
count(status.stat=2) AS statB
FROM
status
INNER JOIN
items
WHERE
items.itemid = status.itemid
GROUP BY
catnum;
(也尝试了on而不是where,同样的结果,statb总数是错误的。)
我已经探索了自连接、内部连接、左/右连接、联合、子查询和其他技术,但我似乎没有达到我想要的。似乎这一定是一个非常常见的通用查询,但我似乎找不到合适的搜索词在网上找到它。任何指导都将不胜感激。
1条答案
按热度按时间uoifb46i1#
您当前的查询将只返回
STATUS
它们有一个给定的catnum
. 这就是为什么statA
以及statB
都是一样的。你需要做的是SUM
每个状态值的出现次数。我制作了一个小的sqlfiddle演示,展示了这个查询的实际情况:输出(对于演示数据):
注意在mysql中,一个布尔表达式(例如。
status.stat='A'
)如果为真,则计算结果为1,如果为假,则计算结果为0,因此可以直接求和。