Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Join - Fatal编程技术网

Mysql 使用联接而不是子查询

Mysql 使用联接而不是子查询,mysql,sql,join,Mysql,Sql,Join,我有一个使用子查询的简单查询: SELECT pictures.* FROM pictures WHERE pictures.user_id IN (SELECT follows.following_id FROM follows WHERE follows.follower_id = 9) ORDER BY created_at DESC LIMIT 5; 我在想, a) 我如何删除子查询并使用联接来代替子查询?b)使用联接代替子查询会有性能优势吗 (follow

我有一个使用子查询的简单查询:

SELECT pictures.*
FROM pictures
WHERE pictures.user_id IN
    (SELECT follows.following_id
     FROM follows
     WHERE follows.follower_id = 9)
ORDER BY created_at DESC LIMIT 5;
我在想, a) 我如何删除子查询并使用联接来代替子查询?b)使用联接代替子查询会有性能优势吗

(follows.following\u id、follows.follower\u id、pictures.user\u id均已编制索引)

谢谢

要进一步了解加入的更多信息,请访问以下链接:

更新

实现相同结果的另一种方法是使用
EXISTS

SELECT  *
FROM    pictures
WHERE   EXISTS
        (
            SELECT  1
            FROM    follows
            WHERE   pictures.user_ID = follows.following_id AND
                    follows.follower_id = 9
        )
ORDER   BY pictures.created_at DESC 
LIMIT   5
要进一步了解加入的更多信息,请访问以下链接:

更新

实现相同结果的另一种方法是使用
EXISTS

SELECT  *
FROM    pictures
WHERE   EXISTS
        (
            SELECT  1
            FROM    follows
            WHERE   pictures.user_ID = follows.following_id AND
                    follows.follower_id = 9
        )
ORDER   BY pictures.created_at DESC 
LIMIT   5

谢谢为什么内部连接?为什么不使用外部左联接?
左联接
将返回表
图片中的所有记录
所有不匹配的记录将在表
后面的列上具有
null
值。但由于已根据表
中的列进行筛选,因此
内部联接中的结果将相同,因为它将只返回与条件匹配的记录<代码>空
记录被删除。尝试执行
LEFT JOIN
,您将得到相同的结果。谢谢!为什么内部连接?为什么不使用外部左联接?
左联接
将返回表
图片中的所有记录
所有不匹配的记录将在表
后面的列上具有
null
值。但由于已根据表
中的列进行筛选,因此
内部联接中的结果将相同,因为它将只返回与条件匹配的记录<代码>空
记录被删除。尝试执行
LEFT JOIN
,您将得到相同的结果。为什么要删除子选择?使用联接的查询返回与子选择完全不同的结果,您需要使用JW的答案中的
distinct
,将联接结果减少到使用子选择的查询结果中。我怀疑这会更快。。要回答b),您必须使用数据集测试这两个版本。@a_horse_和_no_名称我使用了jw答案中的内部联接。它以0.5-1ms的时间给我结果,而子查询则以4.5-7.5ms的时间给我结果。@0xSina:如果没有得到正确的结果,时间是无关的。我只是想指出你需要小心。您不能总是用联接替换子查询。@a_horse_和_no_name啊感谢您指出这一点!我需要学习更多关于加入的知识。你能告诉我为什么需要distinct吗?是否因为可能返回多个与联接完全相同的行?为什么要删除子选择?使用联接的查询返回与子选择完全不同的结果,您需要使用JW的答案中的
distinct
,将联接结果减少到使用子选择的查询结果中。我怀疑这会更快。。要回答b),您必须使用数据集测试这两个版本。@a_horse_和_no_名称我使用了jw答案中的内部联接。它以0.5-1ms的时间给我结果,而子查询则以4.5-7.5ms的时间给我结果。@0xSina:如果没有得到正确的结果,时间是无关的。我只是想指出你需要小心。您不能总是用联接替换子查询。@a_horse_和_no_name啊感谢您指出这一点!我需要学习更多关于加入的知识。你能告诉我为什么需要distinct吗?是不是因为返回的多行可能与连接完全相同?