2016-03-22 14 views
2

den MySql Sum:Php, bu sorgu işi yapmaya çalışıyorum iki tablo

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 ; 

İki tablo var:

, sonuç kısmen yukarıda sorgu çalışır

olduğunu

1. table_days 

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


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

Ancak herhangi bir kayıt bulunmasa bile ikinci tablodan sonuç almak istiyorum. Mevcut yaklaşımla

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

cevap

0

(sqlfiddle de örnek) deneyin:

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

Ve döndürür:

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

görev-3 bilerek orada bırakılmış, bu yüzden kayıt yok, ben 0 – Alko

+0

geri dönmek istiyorum eşik, anladım . Kodu düzeltirim ve şimdi ikinci olarak –

+0

seçiminde görev = 1 için çalışıyor. Aldığım şey bu: [value] => 5.000 [name] => gün – Alko

0

muamma gibi bir şey sizin UNION sorgunun ikinci yarısında ilk yarısında görünen görevler hakkında bir şey "bilmek" olmamasıdır. Ancak, iki tabloyu birleştirmek, iki tablo arasındaki ilişkiden yararlanmanızı sağlar. Bunu yapmanın daha iyi bir yolu böylece tüm görevleri istinat, table_total ile table_days tabloyu LEFT JOIN etmek olacağını düşünüyorum: Eğer table_days tablodan tüm görevleri eklemek istiyorsanız

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 

, sen WHERE maddesini kaldırabilirsiniz.

+0

Sorgunuzda Hata Kodu verir : 1054 'Alan listesinde' bilinmeyen sütun 'gün'. IFNULL (SUM (toplam), 0) – Pallavi

+0

@Pallavi ile ikinci select deyimini IFNULL (SUM (gün), 0) güncelleyin. Üzgünüz, 'toplam' sütunu olmalıydı, lütfen tekrar deneyin. –

1

Bu kod sizin için çalışacaktır Bu sorguyu

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

Sorgunuzu denedim ve benimkiyle tam olarak aynı sonucu üretiyor (toplam değer gösterilmiyor) – Alko

İlgili konular