【问题标题】:Joining two tables on MySQL with multiple conditions在多个条件下连接 MySQL 上的两个表
【发布时间】:2013-11-23 03:37:35
【问题描述】:

我对 MySQL 还很陌生,我正在努力解决这个问题。我有两个不同的表(T1 和 T2),T2 包含 T1 中的所有元素,还有一些额外的元素。

我正在尝试从 T2 获取变量“company”以获取 T1 中的所有值,例如:

SELECT
T2.company as company,
T1.route as route,
T1.departure_time,
T1.arrival_time

当某些条件满足时,如:

T1.route LIKE(CONCAT(T2.airport1,T2.airport2)) AND
T1.departure_time = T2.departure_time AND
T1.arrival_time = T2.arrival_time

我该怎么做?很抱歉这个基本问题,但我现在真的很绝望。非常感谢。

OBS:是的,糟糕的是这两个表来自不同的来源,并且没有唯一的键值可以相应地连接它们,所以这就是为什么我在所有这些条件下都在苦苦挣扎......

【问题讨论】:

  • 桌子上的钥匙是什么?

标签: mysql sql join


【解决方案1】:

你试过了吗?

SELECT
  T2.company as company,
  T1.route as route,
  T1.departure_time,
  T1.arrival_time
from
  t1,t2
where
  T1.route LIKE(CONCAT(T2.airport1,T2.airport2)) AND
  T1.departure_time = T2.departure_time AND
  T1.arrival_time = T2.arrival_time

【讨论】:

  • 是的,我也试过了,但是我收到服务器超时的时间太长了……这两个表很大,每个表有 850 万个条目
  • 结构好像有点瑕疵。你应该重新组织一下表格。为它们添加适当的主键/外键和索引。
【解决方案2】:

你可以在ON子句中添加条件,像这样

SELECT Fields
FROM T1
LEFT JOIN T2
ON T1.company=T2.company 
AND T1.route LIKE(CONCAT(T2.airport1,T1.airport2)) 
AND T1.departure_time = T2.departure_time
AND T1.arrival_time = T2.arrival_time

也就是说,对于仅用于确保行真正连接的条件,确定要选择哪一行的条件将放在 WHERE 子句之后。考虑以下行紧跟在其他行之后

WHERE T1.company='airFoo' 

【讨论】:

  • 我实际上按照您的建议尝试使用 LEFT JOIN,但是花了很长时间才收到超时响应,所以我得出结论,我一定是做错了什么......
  • 你能发布实际使用的查询吗?还要确保正确索引使用的字段。如果你有大表,这真的会减慢查询速度
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多