我发现编写mysql查询以分类我的客户有困难。我根据我网站上的点击次数对客户进行分类。比如
我的日志表架构如下
Unique customer ID, Current Date, Subscribed, Hits Count
要对客户进行分类,如何通过单个查询
将当前日期客户日志与所有以前的日期日志进行比较答案 0 :(得分:1)
从您的描述中不清楚customer_id
是否唯一?
或者它是唯一的元组(customer_id,current_date,subscribed,hits_count)
吗?
如果customer_id
是唯一的,那么这样的内容将返回指定的结果:
SELECT t.customer_id
, CASE
WHEN t.hits_count = 1 AND t.current_date = DATE(NOW())
THEN 'New customer with one hits.'
WHEN t.hits_count > 1 AND t.current_date = DATE(NOW())
THEN 'New customer with multiple hits.'
ELSE 'Old customer'
END AS category
FROM mytable t
如果customer_id
不唯一,那么获得指定结果的方式(但不是最有效的方式):
SELECT t.customer_id
, CASE
WHEN t.total_hits_count = 1 AND t.min_current_date = DATE(NOW())
THEN 'New customer with one hits.'
WHEN t.total_hits_count > 1 AND t.min_current_date = DATE(NOW())
THEN 'New customer with multiple hits.'
ELSE 'Old customer'
END AS category
FROM ( SELECT h.customer_id
, MIN(h.current_date) AS min_current_date
, SUM(h.hits_count) AS total_hits_count
FROM mytable h
GROUP BY h.customer_id
) t
将{@ 1}}别名的内联视图获取customer_id的唯一值,以及最早的t
和current_date
的总和。 (您可以只运行parens中的查询来验证它是否返回了所需的结果。)外部查询与第一个查询相同,只有一些重命名的列。
内联视图不是必需的,您可以使用以下内容获得相同的结果(更有效):
hits_count
注意有一些极端情况会导致customer_id被归类为“老客户”,例如SELECT t.customer_id
, CASE
WHEN SUM(t.hits_count) = 1 AND MIN(t.current_date) = DATE(NOW())
THEN 'New customer with one hits.'
WHEN SUM(t.hits_count) > 1 AND MIN(t.current_date) = DATE(NOW())
THEN 'New customer with multiple hits.'
ELSE 'Old customer'
END AS category
FROM mytable t
GROUP BY t.customer_id
或SUM(t.hits_count) < 1
等。
要在今天的日期之前专门测试具有current_date的行,请在CASE表达式中对其进行特定测试:
t.current_date IS NULL
注意强>
我假设SELECT t.customer_id
, CASE
WHEN SUM(t.hits_count) = 1 AND MIN(t.current_date) = DATE(NOW())
THEN 'New customer with one hits.'
WHEN SUM(t.hits_count) > 1 AND MIN(t.current_date) = DATE(NOW())
THEN 'New customer with multiple hits.'
WHEN MIN(t.current_date) < DATE(NOW())
THEN 'Old customer'
ELSE 'Some other category'
END AS category
FROM mytable t
GROUP BY t.customer_id
列的类型为DATE,而不是DATETIME或TIMESTAMP。如果该列还包括一个不等于午夜00:00:00的时间组件,则只要该时间组件不是午夜,与DATE(NOW())的相等比较就不会返回TRUE。
在这种情况下,我们更愿意检查一系列日期时间值,替换
current_date
有这样的事情:
... AND t.current_date = DATE(NOW())