我如何使用单个where子句而不是两个相同的子句?

时间:2017-06-17 10:26:40

标签: mysql sql performance query-optimization

这是我的问题:

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子句编写查询?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

COUNT(*)cnt和COUNT(金额)的结果是相同的,所以如果你解释一下这个查询的内容/你想要获得什么结果可以帮助更好的方式,但目前你可以使用以下:

从帖子a中选择*,(从列1,列2中的帖子组中选择count(*),count(column1),column1,column2)b其中a.column1 = b.column1和a.column2 = b.column2其中a.column1 =:column1和a.column2 in(:column2);