左连接 - 未知列错误

时间:2012-01-22 12:13:13

标签: mysql sql

我最近一直在浏览我的数据库代码,尝试使用新技术改进我的旧代码,以提高效率。最近我一直在寻找JOIN,我发现了我认为是测试它的绝佳机会。

我目前正在使用以下两个查询来为用户形成一个组列表:

SELECT g.group_id, g. name 
FROM assigned_groups ag, user_groups g 
WHERE ag.user_id=:user_id AND ag.group_id=g.group_id

SELECT g.group_id, g. name 
FROM users u, user_groups g 
WHERE u.user_id=:user_id AND u.base_group=g.group_id

这两个选择语句给我列表,但我想将它们合并为一个。唯一的问题是用户可能有也可能没有“assigned_groups”中列出的任何组。也就是说可选。

据我所知,这意味着我需要左或右连接。我目前有以下语法:

SELECT g.group_id, g. name 
FROM 
  user_groups g, users u 
  LEFT JOIN assigned_groups ag ON ag.user_id=:user_id AND ag.group_id=g.group_id 
WHERE 
 u.base_group=g.group_id AND u.user_id=:user_id

然而,这给了我以下错误: 'on clause'

中的未知列'g.group_id'

这是我的表结构的图像: enter image description here

5 个答案:

答案 0 :(得分:1)

在您的查询中,您将LEFT JOIN应用于左侧的users u和右侧的assigned_group ag user_groups g不属于外部联接,无法在ON子句中引用。

你的意思是:

SELECT g.group_id, g.name
FROM users u,
     user_groups g LEFT JOIN assigned_groups ag
         ON ag.user_id=:user_id AND ag.group_id=g.group_id
WHERE u.base_group=g.group_id AND u.user_id=:user_id

答案 1 :(得分:1)

从隐式JOIN更改为显式JOIN。

这使得g alias稍后可以在FROM子句中使用。

SELECT g.group_id, g.name, 
    ag.name -- guessing here
FROM 
  users u
  JOIN
  user_groups g ON u.base_group = g.group_id 
  LEFT JOIN 
  assigned_groups ag ON ag.user_id = :user_id AND ag.group_id = g.group_id 
WHERE 
  u.user_id = :user_id

注意:这也消除了“首先加入”的歧义

然而,我认为你真的想要这个。这取决于uag

之间的关系

在更多评论之后编辑2

SELECT g.group_id, g.name , 1 as IsBaseGroup
FROM 
  users u
  JOIN
  user_groups g ON u.base_group = g.group_id 
WHERE 
  u.user_id = :user_id
UNION
SELECT ag.group_id, ag.name, 0 as IsBaseGroup
FROM 
  users u
  JOIN 
  assigned_groups ag ON u.user_id = ag.user_id
  JOIN
  user_groups g ON ag.group_id  = g.group_id 
WHERE 
  u.user_id = :user_id;

评论后编辑。

SELECT 
   g.group_id, g.name, 
   CASE WHEN u.base_group = g.group_id THEN 1 ELSE 0 END AS IsBaseGroup
FROM 
  users u
  JOIN 
  assigned_groups ag ON u.user_id = ag.user_id
  JOIN
  user_groups g ON ag.group_id  = g.group_id 
WHERE 
  u.user_id = :user_id

答案 2 :(得分:0)

也许这个会帮助你。 ag.name在返回行时可能为NULL,因为您可能已经理解了这一点。如果需要,请从选择中排除g.name字段。

SELECT u.name,ug.name
FROM  users u 
INNER JOIN assigned_groups ag 
ON u.user_id=ag.user_id
INNER JOIN user_groups ug
ON ag.group_id=ug.group_id    
WHERE u.user_id=:user_id

干杯

答案 3 :(得分:0)

在每对表上尝试使用括号。

您的查询示例:

SELECT g.group_id, g. name 
FROM 
  (user_groups g, users u )
  LEFT JOIN assigned_groups ag ON ag.user_id=:user_id AND ag.group_id=g.group_id 
WHERE 
 u.base_group=g.group_id AND u.user_id=:user_id

更一般的例子:

SELECT a.*, b.*, c.*, d.*
FROM 
  (
     (
       (table1 a, table2 b)
       , table3 c
     )
     LEFT JOIN table4 d ON a.id=d.id and b.idx = d.idx
  )
WHERE 
 u.base_group=g.group_id AND u.user_id=:user_id

答案 4 :(得分:-1)

玩得开心

SELECT g.group_id, g.name
FROM groups g
LEFT JOIN assigned_groups ag 
      ON  ag.group_id=g.group_id
LEFT JOIN users u
      ON  u.base_group=g.group_id
WHERE u.user_id=:user_id OR ag.user_id=:user_id