MySQL LEFT JOIN表或PHP组合数组

时间:2016-10-06 12:30:17

标签: php mysql sql arrays join

我被困住了,我希望得到你的帮助(建议)。我正在使用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)

谢谢!

2 个答案:

答案 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;