0

2 つの複雑な 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

小さなテーブル定義がSQL Fiddleで提供されています

実際には、最初のものは検索クエリであり、2 つ目は過去 24 時間の投票に基づいて最も人気のある結果を提供するため、2 つ目で使用された式と時間範囲に基づいて検索クエリを使用したい

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 句を交換する方が効率的です (同様の先頭の % はインデックスを使用しないため、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 に答える