Mysql 选择一个表中缺少的行与另两个表中缺少的行?

Mysql 选择一个表中缺少的行与另两个表中缺少的行?,mysql,sql,laravel-4,eloquent,Mysql,Sql,Laravel 4,Eloquent,我有三个表,我正试图针对它们构建一个查询,以便只从第三个表中缺少的两个表中获取行 一个是表histories,它引用了另外两个表schedules和templates。如果有模板计划历史记录,我不想获取该计划 通常情况下,我希望可以使用第三个表上的左连接来完成此操作,其中id为NULL,但在这种情况下不起作用。到目前为止,我尝试的每个查询都会返回空列以及我不想要的行 下面是对相关模式的修改和一个示例查询: 如何构造查询以获得所需的结果?您的查询应该是这样的:但是您的查询没有返回任何结果,因为每

我有三个表,我正试图针对它们构建一个查询,以便只从第三个表中缺少的两个表中获取行

一个是表
histories
,它引用了另外两个表
schedules
templates
。如果有模板计划历史记录,我不想获取该计划

通常情况下,我希望可以使用第三个表上的
左连接来完成此操作,其中id
为NULL
,但在这种情况下不起作用。到目前为止,我尝试的每个查询都会返回空列以及我不想要的行

下面是对相关模式的修改和一个示例查询:


如何构造查询以获得所需的结果?

您的查询应该是这样的:但是您的查询没有返回任何结果,因为每个计划/模板都有历史记录

select 
    histories . *,
    histories.id as 'history_id',
    schedules . *,
    schedules.id as 'schedule_id'
from
    schedules
left join
    histories ON schedules.id = histories.schedule_id
        and schedules.template_id = histories.template_id
where
    schedules.schedulable_id = 16
    and schedules.schedulable_type = 'Item'
    and histories.id IS NULL

假设您希望为
计划
表获取不在
历史记录
表中的行,那么您的有力查询如下:

//Fetches list of schedule IDs from Histories table
$schedule_ids = Histories::distinct()->lists('schedule_id')
//Get list of all schedules which are not present in Histories table
$queryresult = Schedules::WhereNotIn('id', $schedule_ids)->get();`
此列表列出了明细表ID 1和ID 2

select 
    schedules . *,
    schedules.id as 'schedule_id',
    histories . *,
    histories.id as 'history_id'
from
    schedules
left join
    histories ON schedules.id = histories.schedule_id
        and schedules.template_id = histories.template_id
where
    histories.id IS NULL
;
此列表列出了计划ID 3,但与其他条件不匹配,例如

  • schedules.schedulable_id=16

请参阅:

计划ID 3不在历史记录表中,所以它不应该出现在结果中吗?如果您想要没有相关历史记录的计划,并且您正试图通过反连接模式获得它,它看起来像是检查是否存在匹配的谓词(
histors.ID为NULL
)应该位于外部联接操作的
WHERE
子句中,而不是
ON
子句中。
select 
    schedules . *,
    schedules.id as 'schedule_id',
    histories . *,
    histories.id as 'history_id'
from
    schedules
left join
    histories ON schedules.id = histories.schedule_id
        and schedules.template_id = histories.template_id
where
    histories.id IS NULL
;