我被困住了,希望得到您的帮助(建议)。我正在使用PHP和MysQL,下面将介绍我的问题。
这是我要实现的简化版本。我有两个表,一个是城市列表,另一个是出发时间。我想左联接这两个表(如果可能的话),并返回所有城市的列表,即使表bus_departures中没有连接的记录也是如此。
我可以仅使用MySQL来做到这一点,还是必须在PHP中组合数组。我希望看到您的解决方案。谢谢你。
城市
-------------------
ID | CITY
-------------------
1 | London
2 | Paris
3 | New York
4 | Rome
5 | Zagreb
巴士出发
------------------------------------------
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
退货
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)
谢谢!
您当然需要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
现在很明显,aWHERE date = '2016-06-07'
不会返回您想要的数据。
但是,如果您在联接子句中包括日期要求,它将起作用,例如:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句