合并两个复杂的MYSQL查询

合并两个复杂的MYSQL查询,mysql,Mysql,我需要关于合并两个复杂MYSQL查询的方法的帮助 问题1: SELECT p.* FROM posts p INNER JOIN ( SELECT a.ID FROM posts a INNER JOIN post_tags b ON a.ID = b.post_ID WHERE a.post LIKE '%mmmm%' AND

我需要关于合并两个复杂MYSQL查询的方法的帮助

问题1:

SELECT  p.*
FROM    posts p
    INNER JOIN
    (
        SELECT  a.ID
        FROM    posts a
                INNER JOIN post_tags b
                    ON a.ID = b.post_ID
        WHERE   a.post LIKE '%mmmm%' AND
                b.tagname IN ('#test','#iseeyou')
        GROUP   BY ID
        HAVING  COUNT(DISTINCT b.tagname) = 2
    ) sub ON p.ID = sub.ID
ORDER   BY p.upvotes DESC, p.unix_timestamp DESC
问题2:

SELECT p.*, ((upvotes + 1.9208) / (upvotes + downvotes) - 1.96 * SQRT((upvotes * downvotes)
 / (upvotes + downvotes) + 0.9604) / (upvotes + downvotes))
 / (1 + 3.8416 / (upvotes + downvotes)) AS ci_lower_bound 
 FROM posts p WHERE upvotes + downvotes > 0 
 AND p.unix_timestamp BETWEEN 1363023402 AND 1363109802 ORDER BY ci_lower_bound DESC
下面给出了一个小表定义


事实上,第一个是搜索查询,第二个是根据过去24小时内的投票数给出的最流行的结果,因此我希望使用基于第二个查询中使用的公式以及时间范围的搜索查询,并进行最小的更改(如果我正确理解了您的要求)

在子选择上交换WHERE子句可能更有效(类似项上的前导%将不使用索引,因此在post_标记上进行易于索引的检查时,可能更有效地连接该索引))


出于好奇:),为什么不使用存储过程呢?为什么要合并它们?@NetStarter我不知道如何使用存储过程来实现这一点。@tombom事实上,第一个是搜索查询,第二个是根据过去24小时的投票结果得出的最流行的结果,因此,我希望使用基于第二个查询中使用的公式和时间范围的搜索查询。您可以通过创建一个临时表并将同一个表连接到存储过程中来执行此操作。我使用了与您建议的相同的方法,得到了一个空结果,但我所做的是在不满足标记名的时间范围内搜索,所以我认为错。现在,看到你的回答,我突然想到了。你启发了我,我的朋友:)我如何找出你建议的两个版本的性能之间的差异?我用
EXPLAIN
检查了一下,但看起来是一样的。我的意思是,你建议我应该怎么做?我希望MySQL能够认识到这个问题并对其进行优化。但有时它不能做到这一点,因此,有时一个直接的连接可以用来强制连接的顺序
SELECT  p.*, ((upvotes + 1.9208) / (upvotes + downvotes) - 1.96 * SQRT((upvotes * downvotes)
 / (upvotes + downvotes) + 0.9604) / (upvotes + downvotes))
 / (1 + 3.8416 / (upvotes + downvotes)) AS ci_lower_bound 
FROM    posts p
    INNER JOIN
    (
        SELECT  a.ID
        FROM    posts a INNER JOIN post_tags b  ON a.ID = b.post_ID
        WHERE   a.post LIKE '%mmmm%' AND b.tagname IN ('#test','#iseeyou')
        GROUP   BY ID
        HAVING  COUNT(DISTINCT b.tagname) = 2
    ) sub ON p.ID = sub.ID
WHERE upvotes + downvotes > 0 
AND p.unix_timestamp BETWEEN 1363023402 AND 1363109802 
ORDER BY ci_lower_bound DESC
SELECT  p.*, ((upvotes + 1.9208) / (upvotes + downvotes) - 1.96 * SQRT((upvotes * downvotes)
 / (upvotes + downvotes) + 0.9604) / (upvotes + downvotes))
 / (1 + 3.8416 / (upvotes + downvotes)) AS ci_lower_bound 
FROM    posts p
    INNER JOIN
    (
        SELECT  a.ID
        FROM    post_tags b STRAIGHT_JOIN posts a ON a.ID = b.post_ID
        WHERE   a.post LIKE '%mmmm%' AND b.tagname IN ('#test','#iseeyou')
        GROUP   BY ID
        HAVING  COUNT(DISTINCT b.tagname) = 2
    ) sub ON p.ID = sub.ID
WHERE upvotes + downvotes > 0 
AND p.unix_timestamp BETWEEN 1363023402 AND 1363109802 
ORDER BY ci_lower_bound DESC