2013-04-05 122 views
0

我想要合併兩個複雜的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 
       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小時內投票的最流行結果,所以我想使用基於第二個公式中使用的公式的搜索查詢以及時間範圍

+0

只是出於好奇:),爲什麼ü不使用存儲過程,這樣做 – NetStarter 2013-04-05 13:27:25

+0

爲什麼要合併他們在所有? – fancyPants 2013-04-05 13:27:53

+0

@NetStarter我不知道如何使用存儲過程。 – coder101 2013-04-05 13:29:09

回答

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 
+0

我使用了與你建議的相同的結果,並得到了一個空的結果,但是我所做的是在不滿足標記名的時間範圍內搜索我以爲我錯了。而現在,看到你的答案,我想起了。你已經啓發了我的朋友:) – coder101 2013-04-05 15:35:27

+0

我如何找出你建議的兩個版本的性能之間的區別?我用'EXPLAIN'檢查過,但它看起來一樣。我的意思是你會建議我應該怎麼辦? – coder101 2013-04-05 15:45:07

+1

我希望通常MySQL會認識到這個問題並優化它。但有時它不能這樣做,因此偶爾STRAIGHT_JOIN可以用來強制JOIN – Kickstart 2013-04-05 15:51:22