如何将子查询的输出附加到当前主查询?

时间:2017-08-18 17:17:42

标签: mysql sql

我有一个: 的 PostTable

它具有varchar 内容,INT groupID

JoinedGroupsTable

它具有INT UserID 和INT GroupID

每当用户加入一个组时,就会将记录添加到具有userid和groupid的groupId中。

我想向数据库发送一个查询,以获取posttable中包含用户已加入的groupID的所有帖子。

这就是我要做的事情:

Select 
posttable.Content
FROM
posttable, joinedgroupstable
WHERE posttable.GroupID =
(SELECT GROUP_CONCAT(joinedgroupstable.GroupID SEPARATOR " OR posttable.GroupID =") 
FROM joinedgroupstable 
WHERE joinedgroupstable.UserID=1 )

这只是一个示例代码,它还没有真正起作用,因为括号之间的最后一部分。

这部分:

(SELECT GROUP_CONCAT(joinedgroupstable.GroupID SEPARATOR " OR posttable.GroupID =") 
    FROM joinedgroupstable 
    WHERE joinedgroupstable.UserID=1 )

将输出类似“1 OR posttable.GroupID = 2 OR posttable.GroupID = 3”等内容,具体取决于在joinedgroupstable中与用户相邻的组ID,我想将其输出连接到主查询,以便它变得像这样:

Select 
posttable.Content
FROM
posttable, joinedgroupstable
WHERE posttable.GroupID =
1  OR posttable.GroupID =2 OR posttable.GroupID =3

因此将子查询的输出连接到主查询。我不知道这是否可行,并想知道是否有更简单的方法。

1 个答案:

答案 0 :(得分:0)

也许这就是你所追求的...... 我不明白为什么你需要加入到joingroupstable,所以我从连接中删除了它。请使用内部,左侧,右侧连接符号而不是from子句中的,符号。

这种方法有时会很慢,并且在一个或两个案例中groupID为null时根本不起作用(特别是在NOT in情况下)

SELECT posttable.Content
FROM posttable
WHERE posttable.GroupID in (SELECT GroupID 
                            FROM joinedgroupstable 
                            WHERE UserID=1 )

另一种方法是加入表然后限制。如果您需要来自两个表的数据,这种方法很有效。

SELECT posttable.Content
FROM posttable
INNER JOIN joinedgroupstable
  on posttable.GroupID = joinedgroupstable.GroupID 
WHERE UserID=1 

或使用coorlated查询并存在。

这样可以很好地处理空值,尤其是在不使用或不存在时。

SELECT pt.Content
FROM posttable pt
WHERE Exists (SELECT *
              FROM joinedgroupstable jgt
              WHERE UserID=1 
                AND pt.groupID = jgt.groupID)

每个引擎在不同的引擎中都有自己的优点和缺点,并且基于数据的性能各不相同。你必须进行测试才能找到最适合你的方法;但是所有3都应该产生相同的结果(除了在空的情况下)