2016-03-22 6 views
2

Я пытаюсь сделать эту работу запроса:Php, MySql Сумма из двух таблиц

SELECT 
    IFNULL(SUM(days), 0) AS days 
FROM 
    `table_days` 
WHERE task = 1 
GROUP BY task 
UNION 
ALL 
SELECT 
    IFNULL(SUM(total), 0) AS total 
FROM 
    `table_total` 
WHERE task = 1 
GROUP BY task ; 

У меня есть две таблицы:

1. table_days 

    id  task days  
    ========================== 
    1  1  3.00 
    2  1  2.00 


2. table_total 
    id  task total 
    ========================== 
    1  3  0.00 

Запрос выше частично работает, результат:

stdClass Object 
(
    [days] => 5.00 
) 

, но я хотел бы получить результат со второй таблицы, даже если записей не найдено. Что-то вроде

stdClass Object 
(
    [days] => 5.00 
    [total] => 0.00 
) 

ответ

0

Этот код будет работать для вас (например, на sqlfiddle):

SELECT 
    IFNULL(SUM(days), 0) AS value, 'days' as name 
FROM 
    `table_days` 
WHERE task = 1 
GROUP BY task 
UNION ALL 

(SELECT CASE WHEN u.value = -1 then 0 else value end as value, 'total' as name 
    FROM 
    (
     SELECT 
      IFNULL(SUM(total), 0) AS value 
     FROM 
      `table_total` 
     WHERE task = 1 
     GROUP BY task 
     UNION 
     SELECT -1 as value 
    ) u 
); 

И он вернется:

+-------+-------+ 
| value | name | 
+-------+-------+ 
|  5 | days | 
|  0 | total | 
+-------+-------+ 
+0

Задача-3 намеренно оставлена ​​там, поэтому, если нет записей, я должен вернуть 0 – Alko

+0

ok, я получаю , Я исправляю код и теперь он работает для задачи = 1 во втором выборе –

+0

Все еще не работает. Это то, что я получаю: [value] => 5.000 [name] => days – Alko

0

головоломке с текущим подходом является то, что вторая половина вашего UNION запроса «не знает» ничего о задачах, которые появляются в первой половине. Однако объединение двух таблиц позволит вам использовать связь между двумя таблицами. Я думаю, что лучший способ сделать это было бы LEFT JOIN в table_days таблицу с table_total, тем самым сохраняя все задачи:

SELECT t1.task, t1.sum_days, t2.sum_total 
FROM 
(
    SELECT task, IFNULL(SUM(days), 0) AS sum_days 
    FROM `table_days` 
    GROUP BY task 
) t1 
LEFT JOIN 
(
    SELECT task, IFNULL(SUM(total), 0) AS sum_total 
    FROM `table_total` 
    GROUP BY task 
) t2 
    ON t1.task = t2.task 
WHERE t1.task = 1 

Если вы хотите включить все задачи из table_days таблицы, вы можете удалить пункт WHERE.

+0

Ваш запрос дает Код ошибки : 1054 Неизвестный столбец 'дней' в 'списке полей'. Пожалуйста, обновите вторую инструкцию select IFNULL (SUM (дни), 0) с IFNULL (SUM (всего), 0) – Pallavi

+0

@Pallavi Извините, что это должен быть столбец 'total', повторите попытку. –

1

Попробуйте этот запрос

SELECT 
    IFNULL(SUM(days), 0) AS days 
FROM 
    `table_days` 
WHERE task = 1 
GROUP BY task 
UNION 
ALL 
SELECT 
    SUM(case when task = 1 then IFNULL(total,0) else 0 end) AS total 
FROM 
    `table_total` 
GROUP BY task ; 
+0

Я попробовал ваш запрос и произвел точно такой же результат, что и мой, (общее значение не показано) – Alko

Смежные вопросы