从同一个表加入

时间:2015-01-26 21:56:47

标签: php mysql

我试图加入同一个表“travel_plan”两次,因为我需要的值是location_from& location_to然后,我可以将值加入到我的城市表中以获取城市名称。

SELECT * FROM travel_plan 
LEFT JOIN Cities ON Cities.CityID = travel_plan.location_to AS plan_to 
LEFT JOIN Cities ON Cities.CityID = travel_plan.location_from AS plan_from
LEFT JOIN user_table ON travel_plan.user_id = user_table.id 
ORDER BY date_from DESC LIMIT 0,4") or die(mysql_error());

2 个答案:

答案 0 :(得分:2)

当您在同一个表中多次加入同一个表格时,您需要正确使用表别名,就像您在此查询中使用Cities一样。

     SELECT * 
       FROM travel_plan  AS tr
  LEFT JOIN Cities       AS C1     ON  C1.CityID = tr.location_to 
  LEFT JOIN Cities       AS C2     ON  C2.CityID = tr.location_from 
  LEFT JOIN user_table   AS us     ON tr.user_id = us.id 
   ORDER BY date_from DESC 
      LIMIT 0,4

您编写查询的方式,LEFT JOIN AS子句放错位置,不用于限定列名。

然而,SELECT *的这种使用确实不是最理想的。从这个四表JOIN中,SELECT *踢回了许多具有重复名称的列,这些列在php中犯了_fetch_assoc()个方法。

您最好的选择是枚举您获取的列,并提供别名,以便它们不会以相同的名称结束。我不知道你的专栏的名字所以我必须猜测,但它会是这样的。

SELECT us.name, us.id AS userid, 
       C1.cityname AS to_cityname,
       C2.cityname AS from_cityname,
  FROM ....

然后,您在获取每一行后,会在$ result [' from_cityname']中找到这些值。

答案 1 :(得分:-2)

您滥用AS关键字,它只能用于查询的选择部分(在FROM之前),或者可选地用作表引用的别名。但不是在联接的ON部分。我想你想要的是:

SELECT *, c1.City as toCity, c2.City as fromCity  FROM travel_plan LEFT JOIN Cities c1 ON c1.CityID = travel_plan.location_to LEFT JOIN Cities c2 ON c2.CityID = travel_plan.location_from LEFT JOIN user_table ON travel_plan.user_id = user_table.id ORDER BY date_from DESC LIMIT 0,4

现在您可以访问结果集中的列别名toCityfromCity,即使原始列名相同。