我试图加入同一个表“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());
答案 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
现在您可以访问结果集中的列别名toCity
和fromCity
,即使原始列名相同。