Php 在左侧联接表中选择COUNT()

Php 在左侧联接表中选择COUNT(),php,mysql,count,left-join,Php,Mysql,Count,Left Join,我正在尝试统计任何给定月份的新潜在客户数和已关闭潜在客户数。下面的查询将正确返回月份数组,但如果月份中有任何潜在客户或成交,则只计算1,而不是该月份发生的实际数量。你知道我做错了什么吗 查询: $productSql = "SELECT months.monthnum as monthnum, COUNT(contacts.lead_date) as lead_date_month, COUNT(contacts.close_date) as close_date_month, contacts

我正在尝试统计任何给定月份的新潜在客户数和已关闭潜在客户数。下面的查询将正确返回月份数组,但如果月份中有任何潜在客户或成交,则只计算1,而不是该月份发生的实际数量。你知道我做错了什么吗

查询:

$productSql = "SELECT months.monthnum as monthnum, COUNT(contacts.lead_date) as lead_date_month, COUNT(contacts.close_date) as close_date_month, contacts.rep as rep 
                FROM months 
                LEFT JOIN contacts 
                ON months.monthnum = MONTH(contacts.lead_date) 
                    AND months.monthnum = MONTH(contacts.close_date) 
                    AND contacts.compid='$compid' 
                    AND YEAR(contacts.lead_date) = '$year' 
                    AND YEAR(contacts.close_date) = '$year' 
                    AND contacts.rep = '$rep' 
                GROUP BY months.monthnum 
                ORDER BY months.monthnum ASC";

$productResult = mysql_query($productSql, $link) or die(mysql_error());


$label[] = $productRow['monthnum'];
$lead[] = $productRow['lead_date_month'];
$close[] = $productRow['close_date_month'];
};

echo "[".json_encode($label).",".json_encode($lead).",".json_encode($close)."]";
结果:

[["January","February","March","April","May","June","July","August","September","October","November","December"],
["0","0","0","0","0","0","0","0","1","1","0","0"],
["0","0","0","0","0","0","0","0","1","1","0","0"]]
**请不要因为我使用mysql而责怪我。这个项目一完成我就把它扔了

构建加入条件的方式只能从MONTHcontacts.lead_date=MONTHcontacts.close_date的记录中获得结果

为了解决这个问题并获得您的实际计数,我建议将语句分为两个查询:

SELECT 
    a.monthnum, 
    a.lead_date_month, b.close_date_month, 
    b.close_date_month / a.lead_date_month
FROM
(
-- Count number of new leads
SELECT 
    months.monthnum as monthnum, 
    COUNT(*) as lead_date_month, 
    contacts.rep as rep 
FROM 
    months 
    LEFT JOIN contacts
ON 
    months.monthnum = MONTH(contacts.lead_date) 
    AND contacts.compid='$compid' 
    AND YEAR(contacts.lead_date) = '$year' 
    AND contacts.rep = '$rep' 
GROUP BY 
    months.monthnum 
ORDER BY 
    months.monthnum ASC
) as a
JOIN
(
-- Count number of closed leads
    SELECT 
    months.monthnum as monthnum, 
    COUNT(*) as close_date_month, 
    contacts.rep as rep 
FROM 
    months 
    LEFT JOIN contacts
ON 
    months.monthnum = MONTH(contacts.close_date) 
    AND contacts.compid='$compid' 
    AND YEAR(contacts.close_date) = '$year' 
    AND contacts.rep = '$rep' 
GROUP BY 
    months.monthnum 
ORDER BY 
    months.monthnum ASC
) as b
ON a.monthnum = b.monthnum

MySQL也没那么糟糕。但是MariaDB更好,你是对的:-

为什么你会因为使用MySQL而受到惩罚?@CharlieS,因为MySQL扩展不受欢迎,并且没有提供预先准备好的语句。PDO或mysqli是首选。我认为它应该可以工作。您可以发布示例数据和/或制作SQLFIDLE吗?出于好奇,什么是contacts.compid和contacts.rep?我在请求-在黑暗中进行排序-看看它们是否可能限制了您的结果。非常感谢!那太完美了。现在,我需要获得每个月已结束/潜在客户*100的已结束潜在客户的先例,但我不知道如何做到这一点,因为它存在于2个查询/while循环中。我尝试了我能想到的所有组合,但没有一个有效。有什么想法吗?我更新了答案。我们的想法是在monthnum列上加入这两个结果