这是我的问题:
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 :(得分: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);