2017-09-26 13 views
0

私は、SQLクエリを次の結合している:Join mysqlクエリーでWhere句とON句を使用する場合

public function exportAll($date) { 
    $sql = "SELECT CONCAT(u.firstname, u.lastname) as fullname, c.early_checkout_remarks, c.delayed_checkin_remarks, DATE(c.checkin_time) as checkin_date, DATE(c.checkout_time) as checkout_date, TIME(c.checkin_time) as checkin_time, TIME(c.checkout_time) as checkout_time 
    FROM users u 
    LEFT JOIN checkin_checkout c 
    ON u.id=c.users_id 
    AND (DATE(c.checkin_time) = '%s' OR DATE(c.checkout_time) = '%s') 
    AND u.deleted IS NULL 
    ORDER BY fullname,checkin_date"; 
    $records = $this->db->exec(sprintf($sql,$date,$date)); 
    return $records; 

私だけが削除されていないユーザーのレコードをしたいです。しかし、このクエリは、 'deleted'カラムに値を持つユーザも返しています。

答えて

1

私はあなたがWHERE句に

AND u.deleted IS NULL 

を移動する必要があると思います。現在、ANDは結合にのみ適用され、最終結果には適用されません。またLEFTジョインであるため、結果を完全に制限するものではありません。

試してみてください。

SELECT 
    CONCAT(u.firstname, u.lastname) as fullname, 
    c.early_checkout_remarks, 
    c.delayed_checkin_remarks, 
    DATE(c.checkin_time) as checkin_date, 
    DATE(c.checkout_time) as checkout_date, 
    TIME(c.checkin_time) as checkin_time, 
    TIME(c.checkout_time) as checkout_time 
FROM 
    users u 
    LEFT JOIN 
    checkin_checkout c 
     ON u.id = c.users_id 
     AND (DATE(c.checkin_time) = '%s' OR DATE(c.checkout_time) = '%s') 
WHERE 
    u.deleted IS NULL 
ORDER BY 
    fullname, 
    checkin_date 

これは、チェックインの日付に関する部分はまた、WHERE句である必要があり、あなたの質問から明らかではありません。要件とデータ構造の詳細を知る必要があります。しかし、それはあなたが必要な場合に試すことができるものです。

また、私はあなたのクエリを再フォーマットしました。このようにフォーマットされた検索クエリは、より迅速かつ正確に読み込み、理解することができます。何がどこで行われているのか、何に何が適用されているのかが分かりやすくなります。

+0

これが機能します!知識のために、On節とWhere節の違いは何ですか? – Azima

+0

問題ありません。私が質問したように、ON句はJOINに条件を適用するだけです(つまり、結合されたテーブルからどの行が含まれるかを制御します)。 WHEREは条件を最終出力に適用します。エクササイズでSQLチュートリアルを行い、結果が何であるかを自分で確認することで、より多くのことを学ぶことができます。簡単なデータで例を試してみると、はるかに明確になり、直感的になります。 – ADyson

1

以下の質問をお試しください。 JOINの後に追加

SELECT CONCAT(u.firstname, u.lastname) as fullname, c.early_checkout_remarks, c.delayed_checkin_remarks, DATE(c.checkin_time) as checkin_date, DATE(c.checkout_time) as checkout_date, TIME(c.checkin_time) as checkin_time, TIME(c.checkout_time) as checkout_time 
    FROM users u 
    LEFT JOIN checkin_checkout c 
    ON u.id=c.users_id 
    Where (DATE(c.checkin_time) = '%s' OR DATE(c.checkout_time) = '%s') 
    AND u.deleted IS NULL 
    ORDER BY fullname,checkin_date 
1
$sql = "SELECT CONCAT(u.firstname, u.lastname) as fullname, c.early_checkout_remarks, c.delayed_checkin_remarks, DATE(c.checkin_time) as checkin_date, DATE(c.checkout_time) as checkout_date, TIME(c.checkin_time) as checkin_time, TIME(c.checkout_time) as checkout_time 
FROM users u 
LEFT JOIN checkin_checkout c ON u.id=c.users_id 
WHERE (DATE(c.checkin_time) = '%s' OR DATE(c.checkout_time) = '%s') 
AND u.deleted IS NULL 
ORDER BY fullname,checkin_date"; 
$records = $this->db->exec(sprintf($sql,$date,$date)); 
return $records; 

。 ONと併用することもできます。そのために