2012-03-14 138 views
0

即时通讯设法让我的查询从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。

任何帮助将不胜感激。

回答

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 
+0

这是梦幻般的。谢谢你的解释! – scarhand 2012-03-14 12:04:37

0

这应该做的伎俩:

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 
0

开始

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,我们可能会帮助您进一步。