MySQL:获取一列的所有值,其中没有与第二列上的条件匹配的行

时间:2011-04-06 08:16:07

标签: mysql

假设我有一个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。

它提供了所有条目的列表,并加入了有关发布每个条目的人的其他信息。条目表很大,因此可伸缩性有点重要。

3 个答案:

答案 0 :(得分:0)

我建议将条目表外部加入人员表,然后按PERSON_ID分组。

只要没有匹配的行,这将导致日期列中的所有值都为NULL,但仍会显示PERSON_ID

之后剩下的就是检查日期列是否为NULL

  • 如果你包含你的表结构,我将能够添加一个可以解释得更好的MySQL语句

答案 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