Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将两个MySQL查询合并为一个_Mysql_Sql_Select_Left Join_In Operator - Fatal编程技术网

将两个MySQL查询合并为一个

将两个MySQL查询合并为一个,mysql,sql,select,left-join,in-operator,Mysql,Sql,Select,Left Join,In Operator,在我的数据库中,我有两个表:回复和线程 我正在尝试创建一个贡献页面,显示用户已开始或回复的线程 内部回复是ThreadId和Poster,它们指定了被回复的线程的Id,线程中的每一行都有一个Id列和一个Poster列 我正在尝试进行查询,以获取用户已发布或已发布的所有线程的行 例如: $myUsername = "Bob"; $q = mysql_query("SELECT * FROM `Threads` WHERE `Poster`='$myUsername' OR (another que

在我的数据库中,我有两个表:回复和线程

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

内部回复是ThreadId和Poster,它们指定了被回复的线程的Id,线程中的每一行都有一个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')");

谢谢

您需要使用IN子句来指定线程id应该在repress表中查询返回的线程id中。这是我正确理解你们表格的结构

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

使用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如果两个表中都没有海报索引,那么查询速度仍然会很慢,尽管数据量很大。

我的做法不同。 这两个查询都返回了重复的内容,所以我决定走更长的路

我所做的:

1检查每个用户的回复,并获取线程id

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

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

4解决方案:

试试这个:

可以使用左外联接而不是IN运算符


Post SHOW CREATE TABLE Threads和SHOW CREATE TABLE REPLIESSLEFT将海报与线程连接起来。发布您的结构,我们将很高兴回答此查询需要很长时间才能加载并使用大量CPU。我有超过10000行的线程和100000行的回复。是查询还是my db?为了让查询运行得更快,您是否准备了必要的索引?您能看到查询的哪些部分执行时间最长吗?我不知道如何看到哪些部分执行时间最长,但我尝试将SELECT*FROM替换为简单的SELECT Id,该Id是行的索引,并且加载速度仍然很慢。您是否使用某种图形工具访问DB ex.MySQL Wrokbench?您应该能够使用您的工具来解释查询,并确切地了解MySQL执行查询的步骤。索引与查询的SELECT部分无关,但与WHERE部分有关,因此选择整个记录还是仅选择id(假设记录不是很大)应该没有多大区别。我使用phpMyAdmin,但我不知道如何做到这一点:/
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