2017-06-17 46 views
0

這裏是我的查詢:如何使用single where子句而不是兩個完全相同的子句?

SELECT * 
FROM posts p1 
CROSS JOIN (SELECT COUNT(*) cnt, COUNT(amount) cntamt 
      FROM posts p2 
      WHERE p2.type = 0 
       OR p2.amount IN (:vals2) 
       OR p2.date_time BETWEEN :s2 AND :e2) t 
WHERE p1.type = 0 
    OR p1.amount IN (:vals1) 
    OR p1.date_time BETWEEN :s1 AND :e1 
ORDER BY p1.id 
LIMIT 0,2 

正如你看到的,有兩個where條款到上面的查詢,都是完全一致的。現在我想知道,如何用單個where子句編寫查詢?

+0

它們不一樣,除非:vals2魔法上與vals1相同。 –

回答

0

這是MySQL的一個痛苦,因爲它不支持CTE。一種解決方案是使用視圖。但是,這是行不通的,因爲你有參數。

變量是另一種選擇

SELECT p.*, @cnt as cnt, @amt as cntamt 
FROM (SELECT p.*, 
      (@cnt := @cnt + 1) as tmp_cnt, 
      (@amt := @amt + (case when amount is not null then 1 else 0 end)) as tmp_amt 
     FROM posts p CROSS JOIN 
      (SELECT @cnt := 0, @amt := 0) params 
     WHERE p.type = 0 OR 
      p.amount IN (:vals2) OR 
      p.date_time BETWEEN :s2 AND :e2 
    ) t 
ORDER by p.id; 
+0

謝謝。是的,你的方法是正確的,符合預期的事情。根據你的知識,你建議我去哪一個?變量*(你的方法)*?還是我的? –

+0

@MartinAJ。 。 。您可能需要衡量性能並選擇最快速的性能。通過'posts(type,amount,datetime)'的索引,它們可能具有可比性。 –

+1

僅供參考,基於一些基準測試,我發現使用變量*(您的方法)*對於大型數據集快兩倍。 –

0

結果COUNT的(*)CNT和COUNT(量)是相同的,所以,如果你explane一下這個查詢的章節目標/什麼是你想獲得的結果可以幫助以更好的方式,但目前可以使用以下內容:

select * from posts a,(select count((),count(column1),column1,column2 from posts group by column1,column2)b where a。 column1 = b.column1和a.column2 = b.column2其中a.column1 =:column1和a.column2 in(:column2);

+0

您必須在最後添加過濾器(where)。再次,您的查詢有性能問題。 –