Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询问题_Sql_Database - Fatal编程技术网

SQL查询问题

SQL查询问题,sql,database,Sql,Database,我正在尝试编写一个SQL查询来检索所有用户挂起的事件,但是我的表的结构很困难 我的表格如下: event { event_id name group_id} Pending { GroupID UserID } Users{ Username UserID } 每个用户都由一个UserID标识,每个组由一个GroupID标识。事件中有一个指向用户列表的GroupID。我需要检索某个用户的所有挂起事件,因此: SELECT * FROM event WHERE event.group_id

我正在尝试编写一个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)
但是我如何链接它,以便只返回具有特定用户ID的用户的挂起事件

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表的连接:

select e.* from event e
inner join pending p on
e.group_id = p.GroupID
where p.UserID = 123
编写此代码的典型方法是使用
内部联接
。传统上,它的性能优于子选择,但现代DBMS:s将它们优化到相同的查询中。如果你真的想写一个子选择你这样键入

SELECT * FROM event
WHERE event.group_id in (SELECT GroupID FROM Pending WHERE UserID = 123)
实际上,如果您已经拥有UserID,则可以跳过与Users表的连接:

select e.* from event e
inner join pending p on
e.group_id = p.GroupID
where p.UserID = 123
编写此代码的典型方法是使用
内部联接
。传统上,它的性能优于子选择,但现代DBMS:s将它们优化到相同的查询中。如果你真的想写一个子选择你这样键入

SELECT * FROM event
WHERE event.group_id in (SELECT GroupID FROM Pending WHERE UserID = 123)
XYZ应该是某个整数值


XYZ应该是某个整数值。

您希望使用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

您希望使用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
您可以尝试:

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
您可以尝试:

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
当选择内容两侧的列具有相同名称时,可以使用
USING()
。它便于阅读。这就是我建议在整个数据库中为相同的数据使用相同名称的主要原因之一。例如,如果您使用
文档
表和主键
文档id
,则在引用文档id的所有其他表中,列使用相同的名称

要了解有关联接的更多信息,请访问或阅读链接。对于每个联接所做工作的可视化表示:

另外,你应该买一些关于你喜欢的RDBMS的书,学习所有的基础知识,然后你可以通过阅读这本书来扩展你的知识。或者你们也可以仔细看看这本书的作者写的

当选择内容两侧的列具有相同名称时,可以使用
USING()
。它便于阅读。这就是我建议在整个数据库中为相同的数据使用相同名称的主要原因之一。例如,如果您使用
文档
表和主键
文档id
,则在引用文档id的所有其他表中,列使用相同的名称

要了解有关联接的更多信息,请访问或阅读链接。对于每个联接所做工作的可视化表示:


另外,你应该买一些关于你喜欢的RDBMS的书,学习所有的基础知识,然后你可以通过阅读这本书来扩展你的知识。或者你们也可以仔细看看这本书的作者写的

非常感谢你的回答,特别是教我你是如何做到的,非常有帮助的+1:)非常感谢你的回答,特别是教我你是如何做到的,非常有帮助的+1:)