Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 将具有不同WHERE和GROUP BY的行计数到1结果_Mysql_Sql_Count - Fatal编程技术网

Mysql 将具有不同WHERE和GROUP BY的行计数到1结果

Mysql 将具有不同WHERE和GROUP BY的行计数到1结果,mysql,sql,count,Mysql,Sql,Count,“质量”列可以是“0”(良好)或“1”(不良),并且每种货物(即使是相同的种类)=1行 这个SQL(我能得到的这个“远”)只显示好的和坏的东西的总数,如果类别存在,但没有任何行,那么它不会显示在最终结果中: T1 - id, name, userID (stocks) - not really used in this cased T2 - id, name, stockID, userID (categories) T3 - id, name, stockID, categoryID, qua

“质量”列可以是“0”(良好)或“1”(不良),并且每种货物(即使是相同的种类)=1行

这个SQL(我能得到的这个“远”)只显示好的和坏的东西的总数,如果类别存在,但没有任何行,那么它不会显示在最终结果中:

T1 - id, name, userID (stocks) - not really used in this cased
T2 - id, name, stockID, userID (categories)
T3 - id, name, stockID, categoryID, quality, userID (goods)
结果:

SELECT T2.name, COUNT(*) AS TOTAL FROM T3
LEFT JOIN T2 ON T2.id=T3.categoryID
WHERE T3.stockID=2 GROUP BY T3.categoryID
category4没有显示,因为不存在行,但我需要显示每一行,即使T3行不存在,当然坏东西也会计数

预期结果:

CATEGORY  - TOTAL
category1 - 1237
category2 -  857
category3 -  125

我认为您希望在另一个方向执行
左连接
(您也可以执行
右外部连接
)。并将
count()
更改为对匹配记录进行计数:

CATEGORY  - BAD / TOTAL
category1 - 425 / 1237
category2 - 326 /  857
category3 -   0 /  125
category4 -   0 /    0
另外,最好选择
GROUPBY
子句中的相同字段。真的,不仅仅是个好主意。大多数数据库(和标准)通常都需要这样做。
groupby
的MySQL扩展可能会导致问题


注意,我将
where
条件移动到
on
子句中。这会阻止额外的筛选,从而删除所需的行。

足够近,但仍然不会显示不存在的行->类别4-0/0如果无法显示不存在的行,则需要一个包含所有类别的表。可能是T1。名称?T1只是库存。。首先创建库存,然后创建类别,然后创建商品。。如果你不创建商品,那么分类是空的,但仍然存在,因为有人创建了它,我想把分类显示为空的或0-0或其他。。我该怎么做?在哪一个表中,所有4个类别都存在?这正是我想要的,非常感谢你的帮助,感谢你的时间和一切,我真的很感激..这也只是非常接近,因为这显示了所有内容,即使货物属于其他类别,并且“坏东西”计数缺失..sqlfiddle在哪里?我刚刚完成它,这里是测试数据和Mihai SQL查询->
SELECT T2.name, coalesce(SUM(t.3bad), 0) as Bad, COUNT(t3.categoryID) AS TOTAL
FROM T2 LEFT JOIN
     T3
     ON T2.id = T3.categoryID and T3.stockID = 2;
GROUP BY T2.name;
SELECT T2.name, SUM(CASE WHEN T3.quality=1 THEN 1 ELSE 0 END)AS BAD,
       COUNT(*)AS TOTAL 
FROM T2
LEFT JOIN T3 ON T2.id=T3.categoryID
WHERE t2.stockid=2
GROUP BY T2.name;