对于具有null值和非null值的记录,MySQL SQL不会返回正确的计数
我在具有三列(代码,amt,名称)的表中具有以下值
"AMPF";"0.1000";"Amplify Inc";
"AMPF";"0.1000";"Amplify Inc";
"AMPF";"0.2000";"Amplify Inc";
"AMPF";"0.2000";"Amplify Inc";
"AMPF";"0.3000";"Amplify Inc";
"AMPF";"0.3000";"";
"AMPF";"0.4000";"";
"XYZA";"0.1000";"PeterPal Inc";
"XYZA";"0.1000";"PeterPal Inc"
我正在运行以下查询,以获取针对特定项目代码存在的记录数。 SELECT代码,名称,count(amt)作为cnt从表组按代码顺序由cnt desc限制30
SELECT code, name, count(amt) as cnt FROM table group by code order by cnt desc limit 30
理想情况下,预期结果应该是:
AMPF,Amplify Inc,7
XYZA,PeterPal Inc,2
但是,结果是:
AMPF,Amplify Inc,5
XYZA,PeterPal Inc,2
它表示尽管我对amt列进行计数,但还是以某种方式将其记录在名称列中,该列在记录号6和7中为空。 对我的代码出了什么问题有任何想法吗?
答案 0 :(得分:0)
首先,只需使用count(*)
:
SELECT code, MAX(name) as name, count(*) as cnt
FROM table
GROUP BY code
ORDER BY cnt desc
LIMIT 30;
正在发生的事情是,看起来像'AMPF'
的值不是真正的'AMPF'
,即它们不相等。我不知道为什么它可以是代码开头的空格,可以是不同字符集中的“外观相似”字符,也可以是隐藏字符。
如果您在列表的下方查找,您应该会看到其他代码也在计算中-如果您省略了LIMIT
。
我还更改了SELECT
,因此NAME
并非取自不确定的行。这只是使用找到的MAX()
值。
答案 1 :(得分:0)
不幸的是,这种情况没有简单的答案。根据设计,MySQL count()函数实际上仅计算NOT NULL值。但是,可以实施以下两种解决方法:
首先,可以运行一个单独的SQL语句来计算NULL记录。
第二,如果通过外键在另一个表中有一个(或多个)期望值,请从另一个表中获取这些值,然后对第一个表进行计数以获得正确的计数。
PS:我用第一个来满足自己的需求。