我正在从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
答案 0 :(得分:0)
LEFT JOIN
的目的是保留从连接右侧获取的与JOIN
的{{1}}条件不匹配的结果集中的行。在这种情况下,ON
左侧的列显示为空。
尝试将JOIN
更改为LEFT JOIN
(JOIN
的缩写)。这将抑制结果集中带空值的行。
答案 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;