2017-07-20 15 views
1

私は単純にカウントがゼロのときを認識するために、次のコードを取得し、日付変数と週番号テーブルMYSQL COUNTは

//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'); 
    } 
に設定0

を返すようにしようとしていることで、グループに参加して、左に0を返しません

このコードは、現在の年の週番号、開始日、終了日、現在の年の現在の日を出力します。次のようになります。

------------------------------------ 
| 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週目をinlcudeていません:

[["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の名前を持つティン:

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

私はこれを理解しようとしている:私はCOALESCEとIFNULLを含めることを試みてきたこれらのメソッドの両方が、どちらで

[[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]] 

は、いずれかのクエリの結果を変更しました1ヶ月間、私はそれを投げるものは何も動作していないようだ。どんな援助や方向性も大いに評価されるでしょう!

答えて

0

プライマリテーブルの列をグループに追加する必要があります。それ以外の場合は、左側の結合のいずれかにのみ存在する値でグループ化します。

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の日付と比較します。

+0

これは以下を出力します(0を含まない)。[["" Jim Kelly "、44,24,12,14,14,16,10,25,12,8,7,6]、[" Rick Zuniga "、3,1,1]、[" Ryan Balcom "、3,30,3,1,10,1,2,5,1,3,3]、[" Jim Roberts "、32,8,7、 「TJ Sutton」、1,10]、「Jared Beckwith」、40,8,13,8,13,7,5,3、 11,5,3,1]、["Paul Schilthuis"、31,11,9,2,8,6,4,5,9,8,4]、["Josh Bell"、34,10,10、 5,9,8,5,23,7,6,6,14]、[「Mike Horton」、37,20,7,10,16,5,6,4,5,3,5,1]] ' –

+0

あなたのコードでクエリの結果で何かをしているのでなければ、上のクエリはその出力を生成しません。 –

+0

where句を指定すると、見つからない行は除外されます。私はそれを編集します.... –

0

WHEREの条件は、最初の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で週を含めていません。私は、あなたがしたいと思われる:それはNULL可能性があるため

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)で集計する必要はありません。

+0

ちょうどこれを試して、次のものを出力しました(期待したものではありません): '[[null、0,0,0,0,0,0,0,0,0,0,0 、0,0,0,0,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 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、 –

+0

最初のquiryが次のように返されました(期待されていないもの): '[[null、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 Schlichwis、31,11,9,2,8,6,4,5,9,8,4]、["TJ Sutton"、1,10]] ' –