Mysql 如何使用子查询?

Mysql 如何使用子查询?,mysql,sql,Mysql,Sql,我发现此查询存在性能问题: SELECT * FROM post JOIN post_plus ON post_plus.news_id = post.id WHERE category in(130,3) AND approve=1 AND allow_main=1 ORDER BY kp_votes DESC, k

我发现此查询存在性能问题:

SELECT * 
          FROM post 
          JOIN post_plus 
          ON post_plus.news_id = post.id 
         WHERE category in(130,3) 
           AND approve=1 
           AND allow_main=1 
      ORDER BY kp_votes DESC, 
               kp_rating DESC LIMIT 30;
我想尝试的是将上述查询转换为子查询,而不是使用JOIN

我所尝试的:

SELECT *
FROM post
WHERE category in(130,3)
    (SELECT *
     FROM post_plus
     WHERE post_plus.news_id = post.id)
  AND approve=1
  AND allow_main=1
ORDER BY fixed DESC,
         kp_votes DESC,
         kp_rating DESC LIMIT 10;
错误1064 42000:您的SQL语法有错误;检查 与右边的MySQL服务器版本相对应的手册 使用near“从post_plus中选择kp_投票kp_评级”的语法 其中第1行的post_plus.news_id='

用户内部联接而不是联接以仅选择匹配的行。一个很好的连接示例。它可能给你带来表演。 使用索引加速您的选择。
修复语法错误的方法如下:

SELECT *
FROM post,
     (SELECT *
     FROM post_plus
     WHERE post_plus.news_id = post.id) tmp
WHERE category in(130,3)
  AND approve=1
  AND allow_main=1
ORDER BY fixed DESC,
         kp_votes DESC,
         kp_rating DESC LIMIT 10;
然而,我坚信这并没有最初的连接那么理想。
我想这是一个索引的问题。您可以显示post表中的索引吗?

如果优化不是这里的问题,您只需要一个替代加入,那么您可以使用

在您的情况下,可能是:

SELECT *
FROM post
WHERE EXISTS
(SELECT *
 FROM post_plus
 WHERE post_plus.news_id = post.id)
AND category in(130,3)
AND approve=1
AND allow_main=1
ORDER BY fixed DESC,
     kp_votes DESC,
     kp_rating DESC LIMIT 10;

where子句中的所有列都来自post_plus吗?使用子查询很可能不会提高性能,相反。是否所有列都有适当的索引供您加入和/或筛选?此外,如果您以列的别名表作为列的前缀,以便在列所在的位置可见,这会有所帮助belong@markg不,有些来自post,有些来自pust_plus。如果您希望我们帮助优化查询,您需要向我们显示表和索引定义,以及每个表的行计数。也许您的表定义不好。可能索引没有正确创建。也许你在你认为你有的专栏上没有索引。如果看不到表和索引定义,我们无法判断。我们还需要行计数,因为这会极大地影响查询优化。如果你知道如何进行解释或获得执行计划,也可以将结果放在问题中。如果您没有索引,请尽快访问。连接与内部连接不一样吗?它不是索引!当你从第二张桌子订购诽谤时,它总是使用临时的;在很多情况下,当mysql使用filesort时,这里有一个类似的例子@Orlo,这是因为索引不正确。我得到了错误1054 42S22:“order子句”中的未知列“kp_vots”,如果它真的是kp_vots,请检查表定义中字段的拼写。或者kp_投票属于post_plus,而不是post table?kp_投票和kp_评级属于post_plus。我尝试更改为post_plus.kp_vots,但在“order子句”中得到相同的未知列“post_plus.kp_vots”。我猜子查询不起作用。from post中的*from post仅包含post表中的字段,因此order BY from post_plus将出现错误,除非在原始查询中使用JOIN like,否则该查询将起作用。