MySQL自联接表错误#1066 - 不唯一的表/别名:'cities_translation'

时间:2016-11-06 14:24:34

标签: php mysql self-join

我有一个用户表和一个订单表以及一个城市名称表,即cities_translation。在用户表中,我有用户ID,名字,姓氏,城市ID和代表ID。该代表只是同一个表中的另一个用户。我想要做的是加入这些表来获得这样的表

user id   first name    last name    city name    representative    wholesaler

  1         foo            bar        city1            2             yes
  2         user           user       city2            0             no

预期结果是

user id   first name    last name    order id    city name    representative 

  1         foo            bar          1         city1            user     

查询:

Select 
  orders.id, orders.user_id, orders.total, orders.final_total, orders.order_status_id, 
  orders.unix_time, u.id,u.email, u.first_name, u.last_name,m.first_name as rep_firstname,
  m.last_name as rep_lastname, u.representative_id,u.city_id,cities_translation.* 
From orders,cities_translation,users u 
  left join cities_translation 
Where u.city_id = cities_translation.city_id
  And orders.user_id = u.id  
  And cities_translation.lang_id='2' 
  And orders.order_status_id='1' 
Left join users r on u.representative_id = r.id 
Group by orders.user_id 
Limit 5

但结果是:“#1066 - 不唯一的表/别名:'cities_translation'”那么如何重写此查询以避免此错误并获得每个批发商的代表名称

2 个答案:

答案 0 :(得分:2)

您正在混合显式和隐含联接

From orders,cities_translation,users u 
left join cities_translation  

你应该采用正确的明确的连接格式..

无论如何,错误消息与您使用两次表格cities_translation(在左边和左边的连接中)的十个事实相关

如果你需要这个表两次你应该使用适当的别名来引用表的每个单一的istance,并使用正确的别名作为相关列名的前缀

From orders,cities_translation as a ,users u 
left join cities_translation  as b 

答案 1 :(得分:1)

如错误所示,您必须为正在连接两次的表创建一个唯一的别名。

Select 
  orders.id, orders.user_id, orders.total, orders.final_total, orders.order_status_id, 
  orders.unix_time, u.id,u.email, u.first_name, u.last_name,m.first_name as rep_firstname,
  m.last_name as rep_lastname, u.representative_id,u.city_id,cities_translation.* 
From orders,cities_translation ct1,users u 
  left join cities_translation ct2
ON u.city_id = ct1.city_id   /** you probably wanted ON here INSTEAD OF WHEN*/
  And orders.user_id = u.id  
  And ct2.lang_id='2' 
  And orders.order_status_id='1' 
Left join users r on u.representative_id = r.id 
Group by orders.user_id 
Limit 5

注意根据需要更改ct1和ct2。

旁注: 习惯上以小写形式编写SQL保留字和以小写形式写列表名 您正在混合显式和隐式连接。当您稍后阅读代码时,这总会导致混淆。尽可能尝试使用表达联接 这种形式的GROUP BY不适用于mysql 5.7 +