通过 SQL 获取订单超过 2 次但登录次数少于 3 次的客户

Posted

技术标签:

【中文标题】通过 SQL 获取订单超过 2 次但登录次数少于 3 次的客户【英文标题】:Get customers that has more than 2 orders but logged in less than 3 times though SQL 【发布时间】:2014-03-27 09:11:51 【问题描述】:

我正在尝试获取所有订单超过 2 次但仅登录不到 3 次的客户。

当用户登录时我正在登录。

但由于某种原因,我只返回一行错误数据...

“user_log”表(user_id 19 只登录过一次)

| user_log_id | date | user_id | type | module_id | unit_id |
|-------------|------|---------|------|-----------|---------|
|      1      |"date"|   19    |  1   |   NULL    |   NULL  |
|      2      |"date"|   20    |  1   |   NULL    |   NULL  |
|      3      |"date"|   20    |  1   |   NULL    |   NULL  |
|      4      |"date"|   20    |  1   |   NULL    |   NULL  |
|      5      |"date"|   20    |  1   |   NULL    |   NULL  |
|-------------|------|---------|------|-----------|---------|

user_id 19 有 2 个订单的“订单”表(删除了不必要的列)

| order_id | user_id | status |
|----------|---------|--------|
|    10    |   19    |   1    | 
|    11    |   19    |   1    |
|    12    |   20    |   1    |
|    13    |   21    |   1    |
|    14    |   31    |   1    |
|----------|---------|--------|

我想要的(User_id有2个订单,但登录不到3次)

| user_id |
|---------|
|    19   |
|---------|

这就是我的 SQL 现在的样子。

$sql = "SELECT 
            ul.*, orders.order_id, orders.user_id, orders.firstname, orders.lastname, COUNT(ul.user_id) AS occourcence                
        FROM 
            orders
        LEFT JOIN
            user_log AS ul
        ON
            orders.user_id = ul.user_id
        WHERE 
            orders.status = 1
        AND
            ul.type = 1
        GROUP BY    
            orders.user_id
        HAVING
            COUNT(orders.user_id) > 1
        ORDER BY 
            orders.order_id DESC";

【问题讨论】:

【参考方案1】:
select user_id,count(user_log_id) from user_log
where user_id in
            (
                select user_id from Orderes
                            group by user_id
                            having count(order_id) =2
                    )
group by user_id
having count(user_log_id) < 3 

【讨论】:

完美!奇迹般有效!你让我开心!【参考方案2】:

避免任何子查询(假设您的意思是登录 3 次,并下达 2 个或更多订单 - 以匹配您的示例数据):-

SELECT a.user_id
FROM user_log a
INNER JOIN orders b
ON a.user_id = b.user_id
GROUP BY a.user_id
HAVING COUNT(DISTINCT user_log_id) < 3 AND COUNT(DISTINCT order_id) >= 2;

这里的 SQL 小提琴:-

http://www.sqlfiddle.com/#!2/1b719/3

【讨论】:

【参考方案3】:

试试这个

select o.user_id from
(
    select user_id from orders
    where status=1 
    group by user_id having count(*)>=2
) as o left join
(
    select user_id from user_logs
    where type=1
    group by user_id having count(*)<3
) as l
on o.user_id=l.user_id

【讨论】:

正确答案,但我们可以避免使用两个子查询。

以上是关于通过 SQL 获取订单超过 2 次但登录次数少于 3 次的客户的主要内容,如果未能解决你的问题,请参考以下文章

SQL退单次数计算

SQL退单次数计算

flink sql 近3天登录次数

flink sql 近3天登录次数

国产化DM达梦数据库 - 用户状态查询锁定与解锁,“登录失败次数超过限制”问题解决

在SQL TableAdapter上使用相同的参数2(或更多)次但仅传递1