簡體   English   中英

對於左聯接和分組依據,MYSQL COUNT不返回0

[英]MYSQL COUNT not returning 0 for Left Join and Group By

我只是想讓下面的代碼識別計數為零並返回0。

設置日期變量和星期數表

//set first of the year and today
  $year = date("Y");
  $start = "01/01/".$year;
  $today = date("Y-m-d");
  $first = $year."-01-01";
  $start = $year."-01-01";

  $date1 = new DateTime($first);
  $date2 = new DateTime($today);
  $interval = $date1->diff($date2);

  $weeks = floor(($interval->days) / 7);

  //create weeks table
    $sql = "DROP TEMPORARY TABLE IF EXISTS weekstbl" ;
    mysqli_query ($db, $sql ) or ( "Error " . mysqli_error () ) ;

    $weekstbl = "
      CREATE TEMPORARY TABLE weekstbl (
        `weekNo` int NOT NULL,
        `weekStart` Date,
        `weekEnd` Date,
        PRIMARY KEY(weekNo)
      )
    ";

   mysqli_query($db, $weekstbl) or die ("Sql error : ".mysqli_error());

  for($i = 1; $i <= $weeks; $i++){    
      $week = $date1->format("W");
      $date1->add(new DateInterval('P6D'));
      $date1->format('Y-m-d');
      $newDate1 = $date1->format('Y-m-d');

      $statement = $db->prepare("INSERT INTO weekstbl (weekNo,weekStart,weekEnd) VALUES (?,?,?)");
      $statement->bind_param('iss', $week,$start,$newDate1);
      $statement->execute();

      $date1->add(new DateInterval('P1D'));
      $start = $date1->format('Y-m-d');
  }

該代碼輸出當前年份到當前日期的所有星期數,星期的開始日期和星期的結束日期。 看起來如下:

------------------------------------
| weekNo |  weekStart |  weekEnd   |
------------------------------------
|   52   | 2017-01-01 | 2017-01-07 |
|    1   | 2017-01-08 | 2017-01-14 |
|    2   | 2017-01-15 | 2017-01-21 |

從訪問系統的當前日期一直持續到現在。 然后,它將用於與其他一些有條件的其他表聯接。 這是我希望返回的結果,但是在下面列出的所有試驗中,我都無法完成。 我在當年有12個星期時運行此程序,這意味着名稱后應有12個數字。

[["Ryan Balcom",3,30,3,1,10,0,1,2,5,1,3,3],["Jared Beckwith",40,8,13,8,13,7,5,3,11,5,3,1],["Jim Roberts",0,32,8,7,2,9,4,2,8,4,4,10],["Jim Kelly",44,24,12,14,14,16,10,25,12,8,7,6],["Josh Bell",34,10,10,5,9,8,5,23,7,6,6,14],["Rick Zuniga",0,0,0,0,0,3,1,1,0,0,0,0],["Mike Horton",37,20,7,10,16,5,6,4,5,3,5,1],["Paul Schilthuis",31,11,9,2,8,6,4,0,5,9,8,4],["TJ Sutton",1,10,0,0,0,0,0,0,0,0,0,0]]

試驗1

    $assignments = "
SELECT COUNT(j.leadid) AS leadcount, u.username
  FROM weekstbl wk
  LEFT JOIN jobbooktbl j
    ON wk.weekNo=WEEK(j.leadcreated)
  LEFT JOIN assignmentstbl a
    ON j.leadid=a.custid
  LEFT JOIN usertbl u
    ON a.userid=u.userid
  WHERE j.leadcreated >= '".$first."' AND j.leadcreated <= '".$today."' AND YEAR(j.leadcreated) = '".$year."'
  GROUP BY WEEK(j.leadcreated), a.userid";
    $assignmentsqry = mysqli_query($db,$assignments);
    while ($row = mysqli_fetch_array($assignmentsqry)) {
      $key = $row['username']; //unnecessary variable for demonstration purposes
      if (!isset($volumeYTDsm[$key])) {
        $volumeYTDsm[$key] = [$row['username']];
      }
      $float = floatval($row['leadcount']);
        $volumeYTDsm[$key][] = $float;
      }
      $volumeYTDsm = array_values($volumeYTDsm);//removing keys
    }

輸出上述內容,但不包括0周:

[["Ryan Balcom",3,30,3,1,10,1,2,5,1,3,3],["Jared Beckwith",40,8,13,8,13,7,5,3,11,5,3,1],["Jim Roberts",32,8,7,2,9,4,2,8,4,4,10],["Jim Kelly",44,24,12,14,14,16,10,25,12,8,7,6],["Josh Bell",34,10,10,5,9,8,5,23,7,6,6,14],["Rick Zuniga",3,1,1],["Mike Horton",37,20,7,10,16,5,6,4,5,3,5,1],["Paul Schilthuis",31,11,9,2,8,6,4,5,9,8,4],["TJ Sutton",1,10]]

試用2

$assignments = "
  SELECT COUNT(*) AS leadcount, u.username
    FROM weekstbl wk
    LEFT OUTER JOIN jobbooktbl j
      ON (wk.weekNo=WEEK(j.leadcreated)) AND j.leadcreated >= '".$first."' AND j.leadcreated <= '".$today."' AND YEAR(j.leadcreated) = '".$year."'
    LEFT JOIN assignmentstbl a
      ON j.leadid=a.custid
    LEFT JOIN usertbl u
      ON a.userid=u.userid
    GROUP BY wk.weekNo, a.userid";

這將輸出以下內容...不確定使用空名稱輸出的內容:

[[null,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],["Ryan Balcom",3,30,3,1,10,1,2,5,1,3,3],["Jared Beckwith",40,8,13,8,13,7,5,3,11,5,3,1],["Jim Roberts",32,8,7,2,9,4,2,8,4,4,10],["Jim Kelly",44,24,12,14,14,16,10,25,12,8,7,6],["Josh Bell",34,10,10,5,9,8,5,23,7,6,6,14],["Rick Zuniga",3,1,1],["Mike Horton",37,20,7,10,16,5,6,4,5,3,5,1],["Paul Schilthuis",31,11,9,2,8,6,4,5,9,8,4],["TJ Sutton",1,10]]

使用這兩種方法,我都試圖包括COALESCE和IFNULL,但是都沒有改變任何一個查詢的結果:

COALESCE(COUNT(j.leadid),0) AS leadcount
IFNULL(COUNT(j.leadid),0) AS leadcount

我一直在努力解決這個問題一個月,但似乎沒有任何投入。 任何幫助或指示將不勝感激!

您需要將主表中的一列添加到分組依據,否則,您將按僅存在於您的左聯接之一中的值進行分組。

SELECT 
    COUNT(j.leadid) AS leadcount, 
    IF(u.username IS NULL,'NOT FOUND',u.username) AS username
FROM weekstbl wk
LEFT JOIN jobbooktbl j
    ON wk.weekNo=WEEK(j.leadcreated)
LEFT JOIN assignmentstbl a
    ON j.leadid=a.custid
  LEFT JOIN usertbl u
    ON a.userid=u.userid
  WHERE (j.leadcreated >= '".$first."' AND 
        j.leadcreated <= '".$today."' AND 
        YEAR(j.leadcreated) = '".$year."') OR
        j.leadcreated IS NULL
  GROUP BY wk.weekno, WEEK(j.leadcreated), a.userid
  ORDER BY wk.weekStart

更好的where子句將與weekstbl的日期進行weekstbl

WHERE的條件是將第一個LEFT JOIN變成一個內部LEFT JOIN 因此,您似乎想要:

SELECT COUNT(j.leadid) AS leadcount, u.username
FROM weekstbl wk LEFT JOIN
     jobbooktbl j
     ON wk.weekNo = WEEK(j.leadcreated) AND
        j.leadcreated >= '".$first."' AND j.leadcreated <= '".$today."' AND
        YEAR(j.leadcreated) = '".$year."'LEFT JOIN
     assignmentstbl a
     ON j.leadid = a.custid LEFT JOIN
     usertbl u
     ON a.userid = u.userid
GROUP BY WEEK(j.leadcreated), a.userid;

但是,您按星期進行匯總,但不包括SELECT的星期。 我懷疑您想要:

SELECT wk.weekNo, u.username, COUNT(j.leadid) AS leadcount
FROM weekstbl wk LEFT JOIN
     jobbooktbl j
     ON wk.weekNo = WEEK(j.leadcreated) AND
        j.leadcreated >= '".$first."' AND j.leadcreated <= '".$today."' AND
        YEAR(j.leadcreated) = '".$year."'LEFT JOIN
     assignmentstbl a
     ON j.leadid = a.custid LEFT JOIN
     usertbl u
     ON a.userid = u.userid
GROUP BY wk.weekNo, a.userid;

您不希望通過WEEK(j.leadcreated)進行聚合,因為這可能為NULL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM