MySQL оставил проблему соединения с предложением SUM и WHERE - PullRequest
2 голосов
/ 10 сентября 2010

В моей базе данных есть 2 таблицы: предмет и категория.Элементы могут быть активными или неактивными и иметь идентификатор категории, связанный с идентификатором записи в таблице категорий.

Я хочу выполнить запрос, чтобы отобразить все категории, с общей стоимостью .активных элементов для категории

Поэтому моя цель - вернуть что-то похожее на это:

    +--------+------------+---------------+
    | id     | cat_name   | total_cost    |
    +--------+------------+---------------+
    |      1 | cat 1      | 12            |
    |      2 | cat 2      | 0             |
    |      3 | cat 3      | 45            |
    +--------+------------+---------------+

Мой первый запрос:

    SELECT a.*, 
    SUM(b.cost) AS total_cost
    FROM categories a LEFT JOIN items b
    ON(a.id = b.category_id)
    GROUP BY a.category_name

работает нормально, но он возвращает NULL-элементы вместо 0 и использует все элементы независимо от того, активен / неактивен:

    +--------+------------+---------------+
    | id     | cat_name   | total_cost    |
    +--------+------------+---------------+
    |      1 | cat 1      | 44            |
    |      2 | cat 2      | NULL          |
    |      3 | cat 3      | 87            |
    +--------+------------+---------------+

мой второй запрос адресует значения NULL:

    SELECT a.*, 
    SUM(IF(b.cost IS NULL, 0, b.cost)) AS total_cost
    FROM categories a LEFT JOIN items b
    ON(a.id = b.category_id)
    GROUP BY a.category_name

и получается какитак:

    +--------+------------+---------------+
    | id     | cat_name   | total_cost    |
    +--------+------------+---------------+
    |      1 | cat 1      | 44            |
    |      2 | cat 2      | NULL          |
    |      3 | cat 3      | 87            |
    +--------+------------+---------------+

Итак, в моем крошечном бесполезном мозгу я пытаюсь выполнить следующий запрос, добавив предложение WHERE в таблицу b, где active должен = 1 (true)

    SELECT a.*, 
    SUM(IF(b.cost IS NULL, 0, b.cost)) AS total_cost
    FROM categories a LEFT JOIN items b
    ON(a.id = b.category_id)
    WHERE b.active = 1 
    GROUP BY a.category_name

получить следующее:

    +--------+------------+---------------+
    | id     | cat_name   | total_cost    |
    +--------+------------+---------------+
    |      1 | cat 1      | 12            |
    |      3 | cat 3      | 45            |
    +--------+------------+---------------+

, чтобы вы могли видеть, я хотел бы вернуть весь диапазон категорий, даже когда правая таблица не дает результатов совпадения ... Любой берет за миллион воображаемых крутых точек

Ответы [ 2 ]

6 голосов
/ 10 сентября 2010

Использование:

   SELECT c.id,
          c.cat_name,
          COALESCE(SUM(i.cost), 0) AS total_cost
     FROM CATEGORIES c
LEFT JOIN ITEMS i ON i.category_id = c.category_id
                 AND i.active = 1
 GROUP BY c.id, c.cat_name
1 голос
/ 10 сентября 2010

Попробуйте это:

  SELECT a.*,  
    SUM(Case B.Active When 1 Then b.cost else 0 End) AS total_cost 
    FROM categories a 
       LEFT JOIN items b 
         ON b.category_id = a.id  
    GROUP BY a.category_name 

или это:

    SELECT a.*, SUM(b.cost) AS total_cost 
    FROM categories a 
       LEFT JOIN items b 
         ON b.category_id = a.id 
            And B.Active = 1 
    GROUP BY a.category_name 
...