我有一个: 的 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
因此将子查询的输出连接到主查询。我不知道这是否可行,并想知道是否有更简单的方法。
答案 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都应该产生相同的结果(除了在空的情况下)