Mysql 按月份和年份分组,从另一个表中计数

Mysql 按月份和年份分组,从另一个表中计数,mysql,select,join,count,unix-timestamp,Mysql,Select,Join,Count,Unix Timestamp,我试图让我的查询从assignments表中按月和按年对行进行分组,并从leads表中计算具有特定值的行数。它们链接在一起,因为分配表有一个id\u lead字段,该字段是leads表中行的id d_new将是网站为newsite.com的当月潜在客户的分配计数 d_subprime将是网站不是newsite.com的当月潜在客户的分配计数 以下是正在使用的表格: `leads` id (int) website (varchar) `assignments` id_lead (int) da

我试图让我的查询从
assignments
表中按月和按年对行进行分组,并从
leads
表中计算具有特定值的行数。它们链接在一起,因为
分配
表有一个
id\u 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\u经销商
是一个变量,其中包含我试图查看其计数的经销商的id


任何帮助都将不胜感激。

这应该可以做到:

SELECT
YEAR(FROM_UNIXTIME(a.date_assigned)) as d_year, 
MONTHNAME(FROM_UNIXTIME(a.date_assigned)) as d_month,
l.website,
COUNT(*)
FROM
assignments AS a
INNER JOIN leads AS l on (l.id = a.id_lead) /*are you sure, that you need a LEFT JOIN?*/
WHERE id_dealership='$id_dealership2'
GROUP BY
d_year, d_month, website
/*an ORDER BY is not necessary, MySQL does that automatically when grouping*/
如果确实需要左连接,请注意COUNT()忽略空值。如果你还想数一数(我无法想象这有什么意义),请这样写:

SELECT
YEAR(FROM_UNIXTIME(a.date_assigned)) as d_year, 
MONTHNAME(FROM_UNIXTIME(a.date_assigned)) as d_month,
l.website,
COUNT(COALESCE(l.id, 1))
FROM
assignments AS a
LEFT JOIN leads AS l on (l.id = a.id_lead)
WHERE id_dealership='$id_dealership2'
GROUP BY
d_year, d_month, website

SELECT 
  MONTHNAME(FROM_UNIXTIME(a.date_assigned)) as d_month, 
  YEAR(FROM_UNIXTIME(a.date_assigned)) as d_year, 
  SUM(IF(l.website='newsite.com',1,0) AS d_new,
  SUM(IF(l.website IS NOT NULL AND l.website!='newsite.com',1,0) 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\u经销商
字段既不在
leads
中,也不在
assignments
中,因此您需要更多的工作


如果您编辑您的问题以解释
id\u经销商
,我们可能会进一步帮助您。

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

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