Mysql 复杂SQL Select语句

Mysql 复杂SQL Select语句,mysql,Mysql,我试图创建一个SQL语句,它执行以下操作,但显然失败了 从视图中选择所有信息,并根据以下条件对其进行筛选: 如果给定的字段customer_编号存在于表中的任何一点 然后在过去30天内检查是否有任何副本 然后输出按客户编号分组的所有不同客户编号 有一个计数,这样我就可以看到一个项目重复了多少次。 因此,使用今天作为当前日期表示我的表中有以下数据项: customer_number, date 111111, 2013-01-01 111111, 2013-05-05 222222, 2013-0

我试图创建一个SQL语句,它执行以下操作,但显然失败了

从视图中选择所有信息,并根据以下条件对其进行筛选:

如果给定的字段customer_编号存在于表中的任何一点 然后在过去30天内检查是否有任何副本 然后输出按客户编号分组的所有不同客户编号 有一个计数,这样我就可以看到一个项目重复了多少次。 因此,使用今天作为当前日期表示我的表中有以下数据项:

customer_number, date
111111, 2013-01-01
111111, 2013-05-05
222222, 2013-01-07
222222, 2013-03-19
333333, 2013-05-15
333333, 2013-05-30
我希望SELECT语句返回以下内容:

customer_number, date, count
111111, 2013-01-01, 2
333333, 2013-05-15, 2
客户2222222不会显示,因为他在过去30天内没有出现

这是我想弄明白的最远的情况。它只返回当前月份的数据

SELECT *, COUNT(customer_number) 
FROM red_flags 
WHERE dealer_id = '75' AND date BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE() 
GROUP BY customer_number 
HAVING COUNT(customer_number) > 1

我一直在绞尽脑汁,想弄清楚这在一个查询中是如何做到的,或者这是否可能做到,如果有任何帮助,我将不胜感激

类似的功能应该适合您—它使用子查询来找出在过去30天内哪些客户被标记。然后,它使用COUNT获得总数,使用MIN获得第一个日期

SELECT customer_number, COUNT(1), MIN(date) minDate
FROM red_flags 
WHERE customer_number IN (
  SELECT customer_number
  FROM red_flags
  WHERE dealer_id = '75' 
      AND date BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE() 
  )
GROUP BY customer_number 
如果你只关心那些有多条记录的,你可以添加HAVING子句


顺便说一句,小心使用日期之间。我更喜欢显式地使用>=和以下是如何使用连接

select r.customer_number, count(*) ct, min(date) minDate
from red_flags r
join (select distinct customer_number
      from red_flags
      where dealer_id = '75'
      and date between CURDATE() - INTERVAL 30 DAY and CURDATE()) x
ON r.customer_number = x.customer_number
group by customer_number
HAVING ct > 1

日期是如何选择的?它总是选择最小值吗?@sgeddes date应该是它第一次出现在表中。似乎正在工作,但我的数据库需要约45秒来解析此查询,是否有任何方法可以加快它?@bmanhard-哇,这是一个很长的时间。你在customer_id字段上有索引吗?我也只关心有多个记录的项目,我在GROUP BY下面添加了HAVING COUNTcustomer_number>1,它不再返回记录。你应该在customer_number上有索引,在dealer_id+上有另一个索引date@bmanhard-添加HAVING子句应该很有效-请参阅更新后的提琴:为什么MySQL在优化方面如此糟糕?在读到更多关于它的文章之前,我没有意识到这一点。谢谢你提醒我。顺便说一句,我认为我编辑的可能是最好的解决方案。亲切的问候@SGEDES看一看解释——它倾向于使用错误的索引。它不是在子查询中选择项,然后在主表中为它们编制索引,而是扫描整个主表,然后在子查询中编制索引。@Barmar-是的,我花了一些时间阅读并查看不同的执行计划。我来自SQL Server,它的IN通常更好或等效,我没有意识到MySQL的优化器有这些限制。似乎JOIN/DISTINCT会比IN本身慢。这里有一个很好的SQL Server,所以发布关于MSSQL的帖子:。无论如何,再次谢谢你。
select r.customer_number, count(*) ct, min(date) minDate
from red_flags r
join (select distinct customer_number
      from red_flags
      where dealer_id = '75'
      and date between CURDATE() - INTERVAL 30 DAY and CURDATE()) x
ON r.customer_number = x.customer_number
group by customer_number
HAVING ct > 1