2017-06-17 66 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)。再次,您的查询有性能问题。 –