MySQL连接提供空值

时间:2017-06-11 22:47:14

标签: mysql sql

我正在从3个表中获取数据并加入它们(我将缩短给予相关部分的信息)

表条目

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

table engdailydata

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

表24hrlog

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

我正试图从中获取一个列表,其中包含条目或24hrlog表中的所有日期

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

3 个答案:

答案 0 :(得分:0)

LEFT JOIN的目的是保留从连接右侧获取的与JOIN的{​​{1}}条件不匹配的结果集中的行。在这种情况下,ON左侧的列显示为空。

尝试将JOIN更改为LEFT JOINJOIN的缩写)。这将抑制结果集中带空值的行。

答案 1 :(得分: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`)))

答案 2 :(得分: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;