我最近一直在浏览我的数据库代码,尝试使用新技术改进我的旧代码,以提高效率。最近我一直在寻找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'这是我的表结构的图像:
答案 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
注意:这也消除了“首先加入”的歧义
然而,我认为你真的想要这个。这取决于u
和ag
在更多评论之后编辑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