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
;