我被困住了,我希望得到你的帮助(建议)。我正在使用PHP& MysQL和我的问题如下所示。
这是我想要实现的简化版本。我有两张桌子,一张是城市名单,另一张是离场。我想LEFT JOIN这两个表(如果可能的话)并返回所有城市的列表,即使表bus_departures中没有连接记录也是如此。
我可以使用MySQL来完成它,或者我必须在PHP中组合数组。我想看看你的解决方案。谢谢。
市
-------------------
ID | CITY
-------------------
1 | London
2 | Paris
3 | New York
4 | Rome
5 | Zagreb
Bus_Departures
------------------------------------------
ID | DATE | CITY | No. DEPARTURES
------------------------------------------
1 | 2016-06-06 | 1 | 5
2 | 2016-06-06 | 4 | 3
3 | 2016-06-06 | 3 | 2
4 | 2016-06-07 | 3 | 4
5 | 2016-06-07 | 1 | 1
6 | 2016-06-08 | 3 | 8
7 | 2016-06-09 | 1 | 3
8 | 2016-06-09 | 4 | 2
选择
SELECT * FROM City LEFT JOIN Bus_Departures WHERE date = '2016-06-07' ORDER BY City ASC
RETURNS
London 2016-06-07 1
New York 2016-06-07 4
我想向用户回复
London 2016-06-07 1
New York 2016-06-07 4
Paris 2016-06-07 - (no records at all)
Rome 2016-06-07 - (no records for this day)
Zagreb 2016-06-07 - (no records at all)
谢谢!
答案 0 :(得分:2)
您当然需要为您的用例执行LEFT JOIN
,但在您当前的语句中,您的WHERE
语句将在已加入的表上运行。因此,在使用WHERE
子句之前,已经连接的表将如下所示:
London | 2016-06-06 | 5
Rome | 2016-06-06 | 3
New York | 2016-06-06 | 2
New York | 2016-06-07 | 4
London | 2016-06-07 | 1
New York | 2016-06-08 | 8
London | 2016-06-09 | 3
Rome | 2016-06-09 | 2
Paris | NULL | NULL
Zagreb | NULL | NULL
现在很明显,WHERE date = '2016-06-07'
不会返回您想要的数据。
如果您在join子句中包含日期要求,它将起作用,例如:
SELECT * FROM City LEFT JOIN Bus_Departures
ON (City.ID = Bus_Departure.CITY AND Bus_Departure.date = '2016-06-07')
ORDER BY City ASC
在这种情况下,LEFT JOIN
只在右侧执行:
------------------------------------------
ID | DATE | CITY | DEPARTURES
------------------------------------------
4 | 2016-06-07 | 3 | 4
5 | 2016-06-07 | 1 | 1
(它也会跑得更快。)
由于您还希望结果中包含日期,因此完整语句可能如下所示:
SELECT City.CITY, '2016-06-07', Bus_Departure.DEPARTURES
FROM City LEFT JOIN Bus_Departures
ON (City.ID = Bus_Departure.CITY AND Bus_Departure.date = '2016-06-07')
ORDER BY City.ID ASC
答案 1 :(得分:0)
当您执行where子句时,您将按日期限制除去所有空值。如果您仍希望在结果中看到它们,则需要在查询中包含空检查。
select c.CITY, bd.DATE, bd.DEPARTURES from city c
left join bus_departures as bd on bd.city = c.id
where bd.DATE='2016-06-07' or bd.DATE is null;