如何在查询中添加一些restrictios?

时间:2018-09-05 14:29:14

标签: mysql sql database join select

我在语法上有困难...

这是我的查询:

SELECT t.diapason,
       Count(*) AS 'number_of_users'
FROM   (SELECT CASE
                 WHEN amount < 200 THEN '0-200'
                 WHEN amount >= 200 THEN '200 +'
               end AS diapason
        FROM   (SELECT Sum(amount) AS amount
                FROM   payments) p) t
GROUP  BY t.diapason
ORDER  BY number_of_users DESC;  

但是现在我只需要选择在'2018-01-01'和'2018-01-12'之间具有activity.login_time的用户。

所以,我想我应该使用INNER JOIN并设置一段时间。怎么办?

我的桌子:

activity
user_id    login_time
1          01.01.2018
2          01.01.2018
3          03.01.2018
4          30.02.2018

payments
user_id    amount   payment_time
1          50       10.12.2017
1          200      09.12.2017
2          40        08.08.2017

我应该在查询中进行哪些更改以添加activity.login_time?

期间01.01.2018-12.01.2018的输出

diapason     number_of_users
0-200          2
200+           1

2 个答案:

答案 0 :(得分:1)

我理解您的问题。在01.01.2018-12.01.2018期间,您有3个用户(user_id = 1,2,3)登录。在这些用户中,user_id 1进行了2次付款,总计250次,user_id 2进行了1次付款,共40次付款,user_id 3进行了0次付款,因此其总值为0。因此,在0-200范围内有2个值,在{范围200 +。如果是正确的理解,此查询将为您提供所需的结果:

SELECT CASE  
         WHEN amount < 200 THEN '0-200'
         WHEN amount >= 200 THEN '200 +'
       END AS diapason,
       COUNT(*) AS number_of_users
FROM (SELECT a.user_id, COALESCE(SUM(p.amount), 0) AS amount
      FROM activity a
      LEFT JOIN payments p ON p.user_id = a.user_id
      WHERE a.login_time BETWEEN '01.01.2018' AND '12.01.2018'
      GROUP BY a.user_id) p
GROUP BY diapason;

输出:

diapason    number_of_users
0-200       2
200 +       1

SQLFiddle demo

更新

要添加总数为number_of_users的另一行,只需在WITH ROLLUP子句中添加GROUP BY

SELECT CASE  
         WHEN amount < 200 THEN '0-200'
         WHEN amount >= 200 THEN '200 +'
       END AS diapason,
       COUNT(*) AS number_of_users
FROM (SELECT a.user_id, COALESCE(SUM(p.amount), 0) AS amount
      FROM activity a
      LEFT JOIN payments p ON p.user_id = a.user_id
      WHERE a.login_time BETWEEN '01.01.2018' AND '12.01.2018'
      GROUP BY a.user_id) p
GROUP BY diapason WITH ROLLUP

输出:

diapason    number_of_users
0-200       2
200 +       1
(null)      3

在您的应用程序框架中,您可以使用diapason值为NULL这样的事实来代替输出类似Total的内容。

Updated SQLFiddle

您也可以在MySQL中执行相同的操作(请参见此SQLFiddle),方法是将该查询包装为子查询,并在COALESCE列上使用diapason。在这种情况下,输出为:

diapason    number_of_users
0-200       2
200 +       1
Total       3

答案 1 :(得分:0)

您添加WHERE子句进行过滤。

SELECT t.diapason,
       COUNT(*) AS 'number_of_users'
FROM (
    SELECT 
        CASE
            WHEN amount < 200 THEN '0-200'
            WHEN amount >= 200 THEN '200 +'
        END AS diapason
    FROM   (
        SELECT payments.user_id, SUM(amount) AS amount
        FROM   payments
        INNER JOIN activity ON payments.user_id = activity.user_idAND activity.login_time = payments.payment_time
        WHERE activity.login_time BETWEEN '2018-01-10' AND '2018-01-12'
        GROUP  BY payments.user_id
    ) p
) t
GROUP  BY t.diapason
ORDER  BY number_of_users DESC;