0

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

查询一:

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

SQL Fiddle给出了一个小表定义

实际上,第一个是搜索查询,第二个根据过去 24 小时内的投票给出最受欢迎的结果,所以我想根据第二个中使用的公式以及时间范围使用搜索查询

4

1 回答 1

0

像这样进行最小的更改(如果我正确理解了您想要的内容)

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

可能更有效地交换子选择上的 WHERE 子句(like 上的前导 % 将不使用索引,因此将其与 post_tags 上易于索引的检查结合起来可能更有效))

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
于 2013-04-05T15:23:16.923 回答