我试图将同一张表“ travel_plan”连接两次,因为我需要的值是location_fromlocation_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());

最佳答案

当您多次连接同一张表时,需要正确使用表别名,就像在此查询中使用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']中找到值。

09-05 16:18