2016-03-22 11 views
2

Ich versuche, diese Abfrage funktioniert:PHP, mySQL Summe aus zwei Tabellen

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 ; 

Ich habe zwei Tabellen:

1. table_days 

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


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

Die Abfrage oben teilweise funktioniert, ist das Ergebnis:

stdClass Object 
(
    [days] => 5.00 
) 

aber ich möchte das Ergebnis aus der zweiten Tabelle erhalten, auch wenn keine Datensätze gefunden werden. So etwas wie

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

Antwort

0

Dieser Code wird für Sie (bei sqlfiddle Beispiel) arbeiten:

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

Und es wird zurück:

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

Aufgabe-3 ist absichtlich dort, also, wenn keine Datensätze sind, will ich zurückgeben 0 – Alko

+0

ok, ich verstehe es . Ich repariere Code und jetzt funktioniert es für Aufgabe = 1 in Sekunde wähle –

+0

Immer noch nicht funktioniert. Folgendes bekomme ich: [Wert] => 5.000 [Name] => Tage – Alko

0

Das Rätsel mit Ihrem aktuellen Ansatz ist, dass die zweite Hälfte Ihrer UNION Abfrage nicht „wissen“ nichts über die Aufgaben, die in der ersten Hälfte erscheinen. Durch Verbinden der beiden Tabellen können Sie jedoch die Beziehung zwischen den beiden Tabellen nutzen. Ich glaube, ein besserer Weg, dies zu tun wäre, die table_days Tabelle LEFT JOIN mit table_total, damit alle Aufgaben beibehalten:

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 

Wenn Sie alle Aufgaben aus der table_days Tabelle aufnehmen mögen, können Sie die WHERE Klausel entfernen.

+0

Ihre Anfrage gibt Fehlercode : 1054 Unbekannte Spalte 'Tage' in 'Feldliste'. Bitte aktualisiere die zweite SELECT-Anweisung IFNULL (SUM (Tage), 0) mit IFNULL (SUM (gesamt), 0) – Pallavi

+0

@Pallavi Sorry, das hätte die 'total'-Spalte sein sollen, probiere es bitte nochmal. –

1

Diese Abfrage

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

Ich habe Ihre Abfrage versucht, und produziert genau das gleiche Ergebnis wie meins, (Gesamtwert wird nicht angezeigt) – Alko