假设我有一个MySQL连接,它给了我一堆包含以下列的行:PERSON_ID,ENTRY_ID,DATE
每个人可以有多个条目,但条目不能属于多个人。我想要检索的是所有未在上个月发布条目的人的列表 - (所有PERSON_ID在NOW()的30天内没有DATE行的行)。我可以在单个查询中获得该结果吗?
我目前的加入基本上是:
SELECT P.ID,P.NAME,P.EMAIL,E.ID,E.DATE from PERSON P,ENTRY E WHERE P.ID = E.PERSON_ID。
它提供了所有条目的列表,并加入了有关发布每个条目的人的其他信息。条目表很大,因此可伸缩性有点重要。
答案 0 :(得分:0)
我建议将条目表外部加入人员表,然后按PERSON_ID
分组。
只要没有匹配的行,这将导致日期列中的所有值都为NULL
,但仍会显示PERSON_ID
。
之后剩下的就是检查日期列是否为NULL
。
答案 1 :(得分:0)
你可能想要某种左空连接...但是,我有点困惑。是否有另一个表格,每个可能的人只有一行,或者您是否想要一个列表,其中包含示例表中至少有一行的所有人,但是如果上个月没有条目?
假设后者(虽然前者似乎更有可能):
select distinct(t1.person_id) from mytable as t1
left join mytable as t2 on t1.person_id = t2.person_id and
t2.`date` > date_sub(now(), interval 30 day)
where t2.person_id is null
;
这基本上是在说“给我一个不同的人ID列表,你不能在过去30天内加入该人ID”
(未经测试的顺便说一句)
...作为另一个评论,你可能会想做类似的事情:
select distinct(t1.person_id) from mytable as t1 where t1.person_id not in
(select person_id from mytable where `date` > date_sub(now(), interval 30 day)
);
只要你的数据集很小并且保持很小,那就很好了,但是在大量的行上会非常严重地缩放......
答案 2 :(得分:0)
假设您的查询类似于
Select tablea.person_id, entry_id, date from tablea
left join
(select * from tableb tableb.date between subdate(now(),30) and adddate(now(),30) as temptable on tablea.person_id=temptable.person_id where temptable.date is null