Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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中使用COUNT后只需一行_Mysql_Sql_Count_Group By_Aggregate Functions - Fatal编程技术网

在MYSQL中使用COUNT后只需一行

在MYSQL中使用COUNT后只需一行,mysql,sql,count,group-by,aggregate-functions,Mysql,Sql,Count,Group By,Aggregate Functions,不知道为什么我只得到一行错误的计数 以下是工作代码: SELECT project_name, sub_project_name FROM projects, sub_projects WHERE projects.project_id = sub_projects.projects_project_id 结果: project_name sub_project_name Bakken Ghost fracture Study Bakken

不知道为什么我只得到一行错误的计数

以下是工作代码:

SELECT project_name, sub_project_name
FROM projects, sub_projects
WHERE projects.project_id = sub_projects.projects_project_id
结果:

project_name         sub_project_name
Bakken               Ghost fracture Study
Bakken               Bakken Mylo QAQC
Bossier              Doyle Boles K No.1
Eagleford            Kennedy Unit#1H
Eagleford            Wehmeyer Unit #1
Niobrara             Crow Valley 7-62-32-1M
Poland               Poland
Woodford             Ridenour Phase 2
Woodford             Teague 1-14H
project_name         sub_project_name          porosity
Bakken               Ghost fracture Study      99
project_name    sub_project_name        porosity
Bakken          Bakken Mylo QAQC        147
Bakken          Ghost fracture Study    252
Bossier         Doyle Boles K No.1      189
Eagleford       Kennedy Unit#1H         294
Eagleford       Wehmeyer Unit #1        0
Niobrara        Crow Valley 7-62-32-1M  0
Poland          Poland                  714
Woodford        Ridenour Phase 2        483
Woodford        Teague 1-14H            0
每个sub_项目都有多个表,我基本上是想看看其中一个表中的一列是否有包含非空值的行,然后在每个sub_项目的另一列中的sub_项目旁边显示该计数

以下是我查询以下语句时得到的结果:

SELECT projects.project_name, sub_projects.sub_project_name, COUNT( bl.bl_por ) AS porosity
FROM projects, sub_projects
LEFT JOIN bl ON sub_projects.sub_project_id = bl.sub_project_id
WHERE projects.project_id = sub_projects.projects_project_id
结果:

project_name         sub_project_name
Bakken               Ghost fracture Study
Bakken               Bakken Mylo QAQC
Bossier              Doyle Boles K No.1
Eagleford            Kennedy Unit#1H
Eagleford            Wehmeyer Unit #1
Niobrara             Crow Valley 7-62-32-1M
Poland               Poland
Woodford             Ridenour Phase 2
Woodford             Teague 1-14H
project_name         sub_project_name          porosity
Bakken               Ghost fracture Study      99
project_name    sub_project_name        porosity
Bakken          Bakken Mylo QAQC        147
Bakken          Ghost fracture Study    252
Bossier         Doyle Boles K No.1      189
Eagleford       Kennedy Unit#1H         294
Eagleford       Wehmeyer Unit #1        0
Niobrara        Crow Valley 7-62-32-1M  0
Poland          Poland                  714
Woodford        Ridenour Phase 2        483
Woodford        Teague 1-14H            0
第一行中每个sub_项目的所有行,除此之外没有其他行

这里怎么了


编辑: 欧文的解决方案解决了这个问题。但是我的表中没有
子项目id
。我只是将其添加到一个表中,以简化测试

因此,我使用欧文的
groupby
建议来编辑我的语句,得到了正确的矩阵形状,但没有得到正确的计数。计数相差甚远

SELECT p.project_name, sp.sub_project_name, COUNT( bl.bl_por ) AS porosity
FROM projects p, sub_projects sp, wells w, cores c, samples s, inputs i
LEFT JOIN bl ON i.inputs_id = bl.inputs_inputs_id
WHERE p.project_id = sp.projects_project_id
AND s.sample_id = i.samples_sample_id
AND c.core_id = s.cores_core_id
AND sp.sub_project_id = c.sub_projects_has_wells_sub_projects_sub_project_id
GROUP BY p.project_name, sp.sub_project_name
结果:

project_name         sub_project_name
Bakken               Ghost fracture Study
Bakken               Bakken Mylo QAQC
Bossier              Doyle Boles K No.1
Eagleford            Kennedy Unit#1H
Eagleford            Wehmeyer Unit #1
Niobrara             Crow Valley 7-62-32-1M
Poland               Poland
Woodford             Ridenour Phase 2
Woodford             Teague 1-14H
project_name         sub_project_name          porosity
Bakken               Ghost fracture Study      99
project_name    sub_project_name        porosity
Bakken          Bakken Mylo QAQC        147
Bakken          Ghost fracture Study    252
Bossier         Doyle Boles K No.1      189
Eagleford       Kennedy Unit#1H         294
Eagleford       Wehmeyer Unit #1        0
Niobrara        Crow Valley 7-62-32-1M  0
Poland          Poland                  714
Woodford        Ridenour Phase 2        483
Woodford        Teague 1-14H            0
正确的结果应该是:

Bakken          Bakken Mylo QAQC        7
Bakken          Ghost fracture Study    12
Bossier         Doyle Boles K No.1      9
Eagleford       Kennedy Unit#1H         14
Eagleford       Wehmeyer Unit #1        0
Niobrara        Crow Valley 7-62-32-1M  0
Poland          Poland                  34
Woodford        Ridenour Phase 2        23
Woodford        Teague 1-14H            0

尝试显式的
JOIN
条件和显式的
groupby
(尽管mysql允许跳过后面的条件)


对补充问题的答复: 再次尝试正确的SQL语法,使用显式的
JOIN
和连接条件:

SELECT p.project_name, sp.sub_project_name, COUNT(bl.bl_por) AS porosity
FROM   projects p
JOIN   sub_projects sp ON p.project_id = sp.projects_project_id
JOIN   wells w -- no JOIN condition? Results in cross join.
JOIN   cores c ON sp.sub_project_id = c.sub_projects_has_wells_sub_projects_sub_project_id
JOIN   samples s ON c.core_id = s.cores_core_id
JOIN   inputs i ON s.sample_id = i.samples_sample_id
LEFT   JOIN bl ON i.inputs_id = bl.inputs_inputs_id
GROUP  BY p.project_name, sp.sub_project_name
这样,您会立即注意到表
wells
是无条件加入的。这将导致一个交叉连接:左侧的每一行都与右侧的每一行一起扩展,从而产生大量的行。可能是你计数过多的原因


还要注意,计数只计算非空值。bl.bl_por为空的任何行都不计算在内。如果您确实想计算行数,可以使用
count(bl.*)

我实际上在bl表中没有子项目id。我创建了非标识关系,并且我的数据具有层次结构。它类似于projects->sub_projects->cores->samples->inputs,然后是在inputs表中有外键的所有其他表,如bl、uss、ss等。inputs表在samples表中有一个外键,以此类推。。因此,真正的问题是使用上述显式方法,我如何使用多重条件代替sp.sub_project_id=bl.sub_project_id来实现这种关系?@user1082783:在这里,为一个新问题打开一个新问题是一种很好的做法。找到这个页面的人将很难弄明白它是关于什么的。您始终可以添加此问题的链接以进行澄清。