mysql - 如何使用 "LEFT ON"获取SQLite中的数据

标签 mysql sqlite left-join

SELECT CaseFolder.CaseId, CaseFolder.CaseCoverImageFileName,
            CaseFolder.CaseName, count(Event.CaseId), CaseFolder.CaseColor,
            CaseFolder.IsMedicalCase, CaseFolder.StartDate, CaseFolder.EndDate
    FROM CaseFolder
    LEFT JOIN Event ON CaseFolder.CaseId = Event.CaseId
    WHERE Event.PersonId = 1 AND Event.IsDeleted = 0 AND CaseFolder.IsDeleted = 0
    GROUP BY CaseFolder.CaseId 

我按表Event 选择Count,并按表CaseFolder 选择另一个。主键 CaseId,但是我需要选择一个表中包含但另一个表中不包含的数据,此时必须添加“where”和“LEFT ON”。如果我删除sql代码WHERE Event.PersonId = 1 AND Event.IsDeleted = 0 AND CaseFolder.IsDeleted = 0 结果是正确的。因为 WHERE 包含不适合表CaseFolder 的条件。我该怎么办?

最佳答案

左连接中第二个表的条件应位于 on 子句中:

SELECT CaseFolder.CaseId, CaseFolder.CaseCoverImageFileName,
       CaseFolder.CaseName, count(Event.CaseId), CaseFolder.CaseColor,
       CaseFolder.IsMedicalCase, CaseFolder.StartDate, CaseFolder.EndDate
FROM CaseFolder LEFT JOIN
     Event
     ON CaseFolder.CaseId = Event.CaseId AND
        Event.PersonId = 1 AND Event.IsDeleted = 0 
WHERE CaseFolder.IsDeleted = 0;
GROUP BY CaseFolder.CaseId ;

否则,LEFT JOIN 会变成 INNER JOIN,因为条件失败并返回 NULL 值。请注意,使用表别名可以更轻松地编写和读取查询:

SELECT cf.CaseId, cf.CaseCoverImageFileName,
       cf.CaseName, count(e.CaseId), cf.CaseColor,
       cf.IsMedicalCase, cf.StartDate, cf.EndDate
FROM CaseFolder cf LEFT JOIN
     Event e
     ON cf.CaseId = e.CaseId AND
        e.PersonId = 1 AND e.IsDeleted = 0 
WHERE cf.IsDeleted = 0;
GROUP BY cf.CaseId ;

关于mysql - 如何使用 "LEFT ON"获取SQLite中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33181693/

相关文章:

mysql - 同一张表上的多个连接

PHP - 将 PDO 与 IN 子句数组一起使用

mysql - Mysql时间范围选择

php - 如何在没有事务的情况下增加PDO SQLite插入?

sqlite - Laravel - PHP Artisan Tinker : How to view all tables in sqlite database

mysql - 左连接,每个左条目只有 1 行

sql - “左连接”与 'LEFT OUTER JOIN'

MySQL EXPLAIN 没有将索引与 WHERE + ORDER BY(索引的两个部分)一起使用?

php - yii2 sqlite 无法解析表名

mysql - 使用联接更新 SQL 查询