MySQL - подсчитывать разные поля при разных условиях в одной объединенной таблице - PullRequest
1 голос
/ 11 ноября 2010

Существует гипотетическая таблица Table1 со столбцами:

  • id
  • условие 1
  • условие 2
  • joinable_key

Есть еще один, Main_Table, чей ID соответствует ключу joinable_key в первом.

Я хотел бы присоединиться к ним таким образом, чтобы я мог посчитать строки Таблицы в соответствии скак к условию 1, так и к условию 2 по отдельности - то есть я бы хотел иметь возможность выполнить «count (Table1.condition1) как first_condition, count (Table1.condtion2) как second_condition» в запросе выбора.

По-видимому, запрос будет выглядеть примерно так:

SELECT  Main_Table.some_column, COUNT(Table1.condition1) AS first_condition, COUNT(Table1.condtion2) AS second_condition
FROM  Main_Table
LEFT JOIN Table1 AS T1 on (T1.joinable_key = Main_Table.id AND T1.condition1 = 'something')
LEFT JOIN Table1 AS T2 on (T2.joinable_key = Main_Table.id AND T2.condition2 = 'something else')
GROUP BY (Main_Table.id)

Однако при выполнении оба результата подсчета равны и фактически умножаются друг на друга.Крайне важно, чтобы все результаты были включены в окончательный вывод, включая результаты, в которых нет записей из Таблицы 1, то есть, если в Таблице 1 нет строки с ключом joinable_key, равным Main_Table.id, его также необходимо включить.

Прежде чем кто-либо предложит сделать два отдельных запроса и обработать их с помощью PHP - да, я знаю, почему и как это можно сделать, но моя цель - выяснить, можно ли выполнить этот мультисчет всев одном запросе.

Спасибо

Ответы [ 2 ]

4 голосов
/ 11 ноября 2010
SELECT some_column,
       (SELECT COUNT(1)
          FROM Table1
         WHERE mt.id = joinable_key
           AND condition1 = 'something'
       ) AS first_condition,
       (SELECT COUNT(1)
          FROM Table1
         WHERE mt.id = joinable_key
           AND condition2 = 'something else'
       ) AS second_condition
  FROM MainTable mt
0 голосов
/ 11 ноября 2010
SELECT  Main_Table.some_column,
        SUM(t1.condition1 = 'something') AS first_condition,
        SUM(t1.condition2 = 'something_else') AS second_condition
FROM    Main_Table
LEFT JOIN
        Table1 AS t1
ON      t1.joinable_key = Main_Table.id
        AND
        (
        t1.condition1 = 'something'
        OR
        t1.condition2 = 'something else'
        )
GROUP BY
        Main_Table.id

Если оба значения condition1 и condition2 являются выборочными, этот синтаксис может быть более эффективным:

SELECT  Main_Table.some_column,
        (
        SELECT  COUNT(*)
        FROM    table1 t1
        WHERE   t1.joinable_key = main_table.id
                AND t1.condition1 = 'something'
        ),
        (
        SELECT  COUNT(*)
        FROM    table1 t1
        WHERE   t1.joinable_key = main_table.id
                AND t1.condition2 = 'something_else'
        )
FROM    Main_Table

Вам следует создать следующие индексы:

table1 (id, condition1)
table1 (id, condition2)

чтобы это работало быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...