在我的数据库中,我有两个表:回复和主题。
我正在尝试创建一个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')");
由于
答案 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