2017-06-11 41 views
0

我從3個表獲取數據,並加入他們(我將縮短給予相關的部分信息)MySQL的加入出現空值

表項

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

表engdailydata

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

表24hrlog

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

我試圖列出所有日期都在任一條目或24hr日誌表中的列表

SQL的工作原理是顯示除日期以外的所有值(如果其中一箇中缺少日期,空值)

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

例如運行這個我返回了40行。

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

我想獲得

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

編輯爲主,後期以進一步澄清 –

+0

你的查詢有一個很奇怪的連接語法,我認爲是無效的,應該被DBMS拒絕。至於你的表:一個'entry'由它的ID標識。每個「入口」都有一個日期。對於每個'entry.id',我們可以在'engdailydata'中找到零個,一個或多個記錄。還有一個包含日期的「24hrlog」表。現在,如果enghrilydata.date存在於「24hrlog」中,或者沒有,則顯示所有'engdailydata'數據以及'24hrlog'數據的所有'entry'數據。它是否正確? –

回答

0

LEFT JOIN的目的是爲了維護行從的右側拍攝的結果集加入不匹配JOINON條件。在這種情況下,JOIN左側的列將會爲空。

嘗試將您的LEFT JOIN更改爲JOININNER JOIN的縮寫)。這將抑制結果集中具有空值的行。

+0

,因爲內部連接刪除一個表中不存在於另一個表中的行,所以它不起作用。 –

0

所以我想出了這個解決辦法,但我希望有一個更好的..

創建視圖

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

然後創建第二個視圖

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

啊,所以你正在尋找一個完整的外連接(MySQL不支持)。即使他們的日期在24hrlog中不存在,你也想要所有的入口/ engdailydata。而且您還希望每24hr日誌的結果行中日期與entry/engdailydata中的日期不匹配。是? –

+0

這是正確的 –

0

你想要一個完整的外連接,但不幸的是MySQL不支持這一點。去了解這一點的一種方法是創建一組與即時所有日期,然後外聯接表:

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;