msql将每个类别中的项按状态按join分为2列

plupiseo  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(274)

我是一个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总数是错误的。)
我已经探索了自连接、内部连接、左/右连接、联合、子查询和其他技术,但我似乎没有达到我想要的。似乎这一定是一个非常常见的通用查询,但我似乎找不到合适的搜索词在网上找到它。任何指导都将不胜感激。

uoifb46i

uoifb46i1#

您当前的查询将只返回 STATUS 它们有一个给定的 catnum . 这就是为什么 statA 以及 statB 都是一样的。你需要做的是 SUM 每个状态值的出现次数。我制作了一个小的sqlfiddle演示,展示了这个查询的实际情况:

SELECT 
    items.catnum, 
    SUM(status.stat='A') AS statA, 
    SUM(status.stat='B') AS statB
FROM items
JOIN status 
ON items.itemid = status.itemid 
GROUP BY items.catnum

输出(对于演示数据):

catnum  statA   statB
1004    1       1
1008    2       1
1010    0       2

注意在mysql中,一个布尔表达式(例如。 status.stat='A' )如果为真,则计算结果为1,如果为假,则计算结果为0,因此可以直接求和。

相关问题