【问题标题】:Just one row after using COUNT in MYSQL在 MYSQL 中使用 COUNT 后仅一行
【发布时间】:2011-12-06 03:50:21
【问题描述】:

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

以下是工作代码:

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

每个 sub_project 都有多个表,我基本上是想查看其中一个表中的列是否有任何包含非 Null 值的行,然后在每个 sub_project 的另一列中的 sub_project 旁边显示该计数。

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

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          porosity
Bakken               Ghost fracture Study      99

第一行中每个 sub_project 的所有行,仅此而已。

这里有什么问题?


编辑:

Erwin 的解决方案成功了。但是我的表中没有sub_project_id。我只是将它添加到一个表中以使其更易于测试。

所以我使用 Erwin 的 GROUP BY 建议来编辑我的语句,我得到了正确的矩阵形状但不是正确的计数。计数还差得很远。

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        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

【问题讨论】:

    标签: mysql sql count group-by aggregate-functions


    【解决方案1】:

    尝试显式的JOIN 条件和显式的GROUP BY(虽然mysql 允许在后面跳过)。

    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
    LEFT   JOIN bl ON sp.sub_project_id = bl.sub_project_id
    GROUP  BY p.project_name, sp.sub_project_name;
    

    回答附加问题:

    再次尝试正确的 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 是无条件加入的。这会导致交叉连接:左侧的每一行都与右侧的每一行一起扩展,从而产生很多行。可能是您计数过多的原因。

    另外请注意,count 只计算非空值。不计算 bl.bl_por IS NULL 的任何行。如果你真的想计算行数,你可以使用count(bl.*)

    【讨论】:

    • 我实际上在 bl 表中没有那个 sub_project_id。我创建了非识别关系,并且我的数据具有层次结构。它类似于项目->子项目->核心->样本->输入,然后是所有其他表,如 bl、uss、ss 等,它们在输入表中具有外键。输入表在样本表中有一个外键等等。所以真正的问题是使用上述显式方法我如何使用多重条件代替 sp.sub_project_id = bl.sub_project_id 来实现关系?
    • @user1082783:在这里为新问题打开一个新问题是一种很好的做法。找到此页面的人将很难弄清楚它的全部内容。您可以随时添加指向此问题的链接以进行澄清。
    猜你喜欢
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2010-09-23
    相关资源
    最近更新 更多