我正在尝试编写一个SQL查询来检索所有用户挂起事件,但是我的表格结构很难。
我的表格如下:
event {
event_id
name
group_id}
Pending {
GroupID
UserID
}
Users{
Username
UserID
}
永久用户由UserID标识,每个组由GroupID标识。事件中包含一个指向用户列表的GroupID。我需要为特定用户检索所有待处理事件,所以:
SELECT * FROM event
WHERE event.group_id = (SELECT GroupID FROM Pending)
但是,如何将其链接,以便仅返回具有特定UserID的用户的待处理事件?
答案 0 :(得分:4)
select e.* from event e
inner join pending p on
e.group_id = p.GroupID
inner join Users u
on p.UserID = u.UserID
where u.UserID = 123
实际上,如果您已经拥有UserID,则可以跳过与Users-table的连接:
select e.* from event e
inner join pending p on
e.group_id = p.GroupID
where p.UserID = 123
编写此代码的典型方法是使用inner join
。传统上它比子选择表现更好,但是现代DBMS:将它们优化为同一查询。如果你真的想用子选择书写,你可以这样输入
SELECT * FROM event
WHERE event.group_id in (SELECT GroupID FROM Pending WHERE UserID = 123)
答案 1 :(得分:1)
您希望使用JOIN子句将表链接在一起,而不是使用WHERE子句来过滤
SELECT u.username,
e.name
FROM users u
INNER JOIN pending p
ON u.userid = p.userid
INNER JOIN event e
ON p.groupid = e.groupid
WHERE
u.UserID = SomeID
答案 2 :(得分:1)
SELECT
event.event_id
FROM event
LEFT JOIN Pending ON event.group_id = Pending.GroupID
LEFT JOIN Users USING (UserID)
WHERE Users.Username = 'foobar'
当选择两侧的列具有相同名称时,可以使用 USING()
。它使阅读更容易。这是我建议在整个数据库中为相同数据使用相同名称的主要原因之一。例如,如果您Documents
表和主键document_id
,那么在您引用文档ID的所有其他表中,您对列使用相同的名称。
要详细了解JOIN:请在mysql或postgresql中阅读相关链接。并且可视化地表示每个联接的作用:this article。
另外,您应该获得一些关于您喜欢的RDBMS的书籍并学习所有基础知识,然后通过阅读SQL Antipatterns书来扩展您的知识。或者您可以仔细查看由书籍作者制作的slides。
答案 3 :(得分:0)
SELECT * FROM event E,
pending P,
Users U
WHERE E.group_id = P.GroupID
AND P.UserID = U.UserID
AND U.UserID = (Some XYZ id)
XYZ应该是一些整数值。
答案 4 :(得分:0)
您可以尝试:
select e.*, u.* from pending as p, users as u, event as e
WHERE
p.group_id = e.group_id
AND p.user_id = u.userID