将两个MySQL查询合并为一个

时间:2012-06-01 08:58:11

标签: mysql sql select left-join in-operator

在我的数据库中,我有两个表:回复和主题。

我正在尝试创建一个Contributions页面,显示用户已启动或回复的主题。

内部回复是“ThreadId”和“Poster”,它指定回复的主题的ID,并且Threads中的每一行都有一个Id列和一个“Poster”列。

我正在尝试进行查询以获取用户已发布或发布的所有THREADS的行。

示例:

$myUsername = "Bob";
$q = mysql_query("SELECT * FROM `Threads` WHERE `Poster`='$myUsername'
OR (another query to find if they had a row in Replies matching `ThreadId`='$tid'
AND `Poster`='$myUsername')");

由于

4 个答案:

答案 0 :(得分:0)

您需要使用IN子句指定线程ID应该位于回复表中的查询返回的内容中。这样的事情是我理解你的表格的结构。

SELECT * FROM Threads WHERE Poster = $myUsername OR Id IN (
SELECT ThreadId FROM Replies WHERE Poster = $myUsername
)

答案 1 :(得分:0)

使用Christina的解决方案可能不会产生非常有效的查询。以下更好:

SELECT * 
FROM Threads t1
WHERE t1.Poster='$myUsername'
UNION
SELECT *
FROM Threads t2
INNER JOIN replies r
ON t2.id=r.thread_id
WHERE t2.Poster<>'$myUsername'
AND r.Poster='$myUsername';

然而:

1)你真的需要来自threas表的所有列吗?即使你这样做,使用'*'也是凌乱的

2)如果用户进行了多次回复,您仍然会获得重复项 - 但在使用“*”时无法修复此问题

3)如果你在两个表中都没有海报索引,那么查询仍将是大量数据。

答案 2 :(得分:0)

我的做法不同。 提供的两个查询返回重复,但没有,所以我决定再走一段路。

我做了什么:

1)浏览每个用户的回复,并获取线程ID

2)使用这些ID构建查询字符串,例如“或Id = $ threadId或Id = $ threadId2”等

3)将查询字符串放入线程查询中,例如SELECT * FROM Threads WHERE Poster = $ user $ queryString2

4)解决方案。 :)

答案 3 :(得分:0)

试试这个:

您可以使用 LEFT OUTER JOIN 代替 IN 运算符

SELECT T.* 
FROM Threads T 
LEFT OUTER JOIN Replies R ON T.Id = R.ThreadId AND R.Poster = $myUsername
WHERE T.Poster = $myUsername OR R.Id IS NOT NULL