【问题标题】:group by month and year, count from another table按月和年分组,从另一个表中计数
【发布时间】:2012-03-30 18:27:06
【问题描述】:

我试图让我的查询按月和年对 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。

任何帮助将不胜感激。

【问题讨论】:

    标签: mysql select join count unix-timestamp


    【解决方案1】:

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

    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
    

    【讨论】:

      【解决方案2】:

      这应该可以解决问题:

      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*/
      

      如果您确实需要 LEFT JOIN,请注意 COUNT() 会忽略 NULL 值。如果您也想计算这些(我无法想象这是有道理的),请这样写:

      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
      

      【讨论】:

        【解决方案3】:

        开始
        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_dealership 字段既不在 leads 也不在 assignments 中,因此您需要做更多工作。

        如果您编辑您的问题以解决id_dealership,我们或许可以为您提供进一步的帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-25
          • 1970-01-01
          • 1970-01-01
          • 2017-03-25
          • 1970-01-01
          相关资源
          最近更新 更多