2012-03-14 92 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,我們可能會幫助您進一步。