2017-06-11 1 views
0

I-Daten aus drei Tabellen nehme und sie verbindenden (i Informationen an die betreffenden Teile gegeben verkürzen)MySQL Join kommt mit Nullwerten bis

Tabelleneintrag

date/id/... 
5/1/2017/1 
5/2/2017/2 
5/3/2017/3 
. 
. 
. 
6/1/2017/42 

Tisch engdailydata

entry_id/enginehrs/... 
1/654186 
2/655000 
3/660000 
. 
. 
. 
42/800000 

Tisch 24hrlog

date/air1/.. 
6/1/2017/4200 

Ich versuche, eine Liste aus diesem zu bekommen, die alle Daten in Eintrag oder 24hrlog Tabelle hat

Die SQL funktioniert, um alle Werte mit Ausnahme des Datums (wenn Datum fehlt in einer von ihnen ich bekomme Nullwert)

SELECT 
    `entry`.`date` AS `date1`, 
    `24hrlog`.`date` AS `date2`, 
    engdailydata`.`enginehrs1` AS `enginehrs1`, 
    `24hrlog`.`air1` AS `air1` 
    FROM 
    (`engdailydata` 
    LEFT JOIN (`24hrlog` 
    JOIN `entry` ON ((`entry`.`date` = `24hrlog`.`date`))) ON 
        ((`entry`.`entry_id` = `engdailydata`.`entry_id`))) 

Zum Beispiel läuft das ich bin 40 Zeilen zurückgegeben.

date1/date2/enginehrs1/air1 
NULL/NULL/654186 /NULL 
NULL/NULL/655000 /NULL 
NULL/NULL/660000 /NULL 
. 
. 
. 
6/1/2017/6/1/2017/800000/4200 

Was ich

date1/date2/enginehrs1/air1 
5/1/2017/NULL/654186 /NULL 
5/2/2017/NULL/655000 /NULL 
5/3/2017/NULL/660000 /NULL 
. 
. 
. 
6/1/2017/6/1/2017/800000/4200 
+0

bearbeitet Hauptpost zur weiteren Klärung –

+0

Ihre Anfrage hat eine sehr seltsame Join-Syntax, die ich denke, ist ungültig und sollte vom DBMS abgelehnt werden. Zu Ihren Tabellen: Ein 'Eintrag' wird durch seine ID identifiziert. Jeder 'Eintrag' hat ein Datum. Für jede 'entry.id' können wir null, einen oder viele Datensätze in' engdailydata' finden. Es gibt auch eine Tabelle '24hrlog' mit Daten. Nun wollen Sie alle 'entry' Daten mit all ihren' engdailydata' Daten zusammen mit den '24hrlog' Daten anzeigen, wenn die 'engdailydata.date' in' 24hrlog' existiert oder ohne wenn nicht. Ist das richtig? –

Antwort

0

LEFT JOIN zu bekommen versuchen ‚s Ziel ist es Zeilen in der Ergebnismenge von der rechten Seite von der genommen zu erhalten kommt, dass nicht übereinstimmen, dass JOIN‘ s ON Zustand . Die Spalten von der linken Seite der JOIN kommen in diesem Fall Null heraus.

Versuchen Sie, Ihre LEFT JOIN zu JOIN (eine Abkürzung für INNER JOIN) zu ändern. Dadurch werden die Zeilen mit Nullen aus der Ergebnismenge unterdrückt.

+0

das funktioniert nicht für das, was ich tun möchte, da innerer Join die Zeilen in einer Tabelle entfernt, die in der anderen Tabelle nicht vorhanden ist. –

0

So kam ich mit dieser Lösung, aber ich erwarte, dass es ein besseres ist ..

Ansicht erstellen

VIEW `runhrs1` AS 
    SELECT 
     `entry`.`date` AS `date1`, 
     `engdailydata`.`enginehrs1` AS `enginehrs1` 
    FROM 
     (`engdailydata` 
     JOIN `entry` ON ((`entry`.`entry_id` = `engdailydata`.`entry_id`))) 

Dann zweite Ansicht erstellen

VIEW `runhrs` AS 
    SELECT 
     `24hrlog`.`air1` AS `air1`, 
     `runhrs1`.`date1` AS `date`, 
     `runhrs1`.`enginehrs1` AS `enginehrs1`, 

    FROM 
     (`runhrs1` 
     LEFT JOIN `24hrlog` ON ((`runhrs1`.`date1` = `24hrlog`.`date`))) 
UNION 

SELECT 
     `24hrlog`.`air1` AS `air1`, 
     `runhrs1`.`date1` AS `date`, 
     `runhrs1`.`enginehrs1` AS `enginehrs1`, 

    FROM 
     (`runhrs1` 
     Right JOIN `24hrlog` ON ((`runhrs1`.`date1` = `24hrlog`.`date`))) 
+0

Ah, Sie suchen also nach einem vollständigen äußeren Join (den MySQL nicht unterstützt). Sie möchten alle Einträge/engdailydata auch dann, wenn ihr Datum in 24hrlog nicht existiert. Und Sie wollen auch eine Ergebniszeile pro 24hrlog, in der das Datum keine Übereinstimmung in entry/engdailydata hat. Ja? –

+0

das ist richtig –

0

Sie möchten eine vollständige Outer Join, aber MySQL unterstützt dies leider nicht. Ein Weg, um dies zu realisieren ist ein Set mit allen Terminen on-the-fly zu erstellen und dann kommen äußere Tabellen:

select 
    all_dates.date, 
    log.air1, 
    edd.enginehrs 
from 
(
    select date from entry 
    union 
    select date from 24hrlog 
) all_dates 
left join 24hrlog log on log.date = all_dates.date 
left join entry e on e.date = all_dates.date 
left join engdailydata edd on edd.entry_id = e.entry_id;