Всего одна строка после использования COUNT в MYSQL - PullRequest
2 голосов
/ 06 декабря 2011

Не уверен, почему я получаю только одну строку с неправильным счетом!

Ниже приводится рабочий код:

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 в другом столбце для каждого 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_id в моих таблицах.Я просто добавил его в одну таблицу, чтобы упростить его для тестирования.

Поэтому я использовал предложение Эрвина 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

1 Ответ

2 голосов
/ 06 декабря 2011

Попробуйте явное 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.*).

...