mysql - 按月和年分组,从另一个表中计数

标签 mysql select join count unix-timestamp

我试图让我的查询从assignments表中按月和年对行进行分组,并计算leads表中具有特定值的行数。它们链接在一起,因为 assignments 表有一个 id_lead 字段,它是 leads 中行的 id > 表。

d_new 是网站为 newsite.com 的月份潜在客户分配的计数 d_subprime 将是网站不是 newsite.com 的当月潜在客户分配计数

这里是正在使用的表格:

`leads`
id (int)
website (varchar)

`assignments`
id_lead (int)
date_assigned (int)

这是我的查询,但不起作用:

SELECT 
  MONTHNAME(FROM_UNIXTIME(a.date_assigned)) as d_month, 
  YEAR(FROM_UNIXTIME(a.date_assigned)) as d_year, 
  (select COUNT(*) from leads where website='newsite.com' ) as d_new,
  (select COUNT(*) from leads where website!='newsite.com') as d_subprime
FROM assignments as a
left join leads as l on (l.id = a.id_lead)
where id_dealership='$id_dealership2'
GROUP BY 
  d_month, 
  d_year
ORDER BY
    d_year asc,
    MONTH(FROM_UNIXTIME(a.date_assigned)) asc

$id_dealership 是一个变量,其中包含我试图查看其计数的经销商 ID。

任何帮助将不胜感激。

最佳答案

您可以将时间戳截断为几个月,并使用获得的值进行分组,然后从中导出必要的日期部分:

SELECT
  YEAR(d_yearmonth) AS d_year,
  MONTHNAME(d_yearmonth) AS d_month,
  …
FROM (
  SELECT
    LAST_DAY(FROM_UNIXTIME(a.date_assigned)) as d_yearmonth,
    …
  FROM assignments AS a
    LEFT JOIN leads AS l ON (l.id = a.id_lead)
  WHERE id_dealership = '$id_dealership2'
  GROUP BY
    d_yearmonth
) AS s
ORDER BY
  d_year            ASC,
  MONTH(d_yearmonth) ASC

嗯,LAST_DAY() 并没有真正截断时间戳,但它确实将属于同一月份的所有值转换为相同的值,这基本上就是我们所需要的。

我想计数应该与您实际选择的行相关,这不是您的子查询。像这样的事情可能会做:

…
COUNT(d.website = 'newsite.com' OR NULL) AS d_new,
/* or: COUNT(d.website) - COUNT(NULLIF(d.website, 'newsite.com')) AS d_new */
COUNT(NULLIF(d.website, 'newsite.com'))  AS d_subprime
…

这是包含所有提到的修改的完整查询:

SELECT
  YEAR(d_yearmonth) AS d_year,
  MONTHNAME(d_yearmonth) AS d_month,
  d_new,
  d_subprime
FROM (
  SELECT
    LAST_DAY(FROM_UNIXTIME(a.date_assigned)) as d_yearmonth,
    COUNT(d.website = 'newsite.com' OR NULL) AS d_new,
    COUNT(NULLIF(d.website, 'newsite.com'))  AS d_subprime
  FROM assignments AS a
    LEFT JOIN leads AS l ON (l.id = a.id_lead)
  WHERE id_dealership = '$id_dealership2'
  GROUP BY
    d_yearmonth
) AS s
ORDER BY
  d_year            ASC,
  MONTH(d_yearmonth) ASC

关于mysql - 按月和年分组,从另一个表中计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9699533/

相关文章:

php - 按任意顺序对 SQL 行输出进行排序?

mysql - 为什么此代码能够在 HAVING 中使用来自 SELECT 的别名?

sql - 如何在 Oracle Select 中获取列中的邻近数字

MySQL 多重连接

php - 错误 : Join in MySql, PHP

php - CakePHP 保存 HABTM 数据

sql - mysql group by返回一个min值并得到对应的行数据

mysql - SQL 从具有该值的不同 id 的列中选择值

mysql - 如何通过 MAX(date) 检索行数据?

mysql - 加入同一张表的重复行