通过 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 次的客户的主要内容,如果未能解决你的问题,请参考以下文章