1

在我的数据库中,我有两个表:Replies 和 Threads。

我正在尝试创建一个贡献页面,显示用户已启动或回复的线程。

内部回复是“ThreadId”和“Poster”,它们指定了它被回复的线程的 Id,并且 Threads 中的每一行都有一个 Id 列以及一个“Poster”列。

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

例子:

$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

4 回答 4

0

您将需要使用 IN 子句来指定线程 id 应该在回复表中的查询返回的那些中。这样的事情是我正确理解了您的表格的结构。

SELECT * FROM Threads WHERE Poster = $myUsername OR Id IN (
SELECT ThreadId FROM Replies WHERE Poster = $myUsername
)
于 2012-06-01T09:05:05.577 回答
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)如果您在两个表中的海报上都没有索引,则查询仍然会很慢,因为大量数据。

于 2012-06-01T09:52:45.257 回答
0

我做了不同的事情。这两个查询提供了返回的重复项和什么没有,所以我决定走更长的路。

我做了什么:

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

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

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

4) 解决方案。:)

于 2012-06-01T16:33:23.913 回答
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
于 2015-01-05T11:04:15.163 回答