【问题标题】:MySQL: get all values of one column for which there is no row matching a condition on a second columnMySQL:获取一列的所有值,其中没有符合第二列条件的行
【发布时间】:2011-04-06 08:16:06
【问题描述】:

假设我有一个 MySQL 连接,它为我提供了一堆包含以下列的行:PERSON_ID、ENTRY_ID、DATE

每个人可以有多个条目,但一个条目不能属于多个人。我要检索的是上个月未发布条目的所有人的列表 - (在 NOW() 的 30 天内没有 DATE 行的所有 PERSON_ID)。我可以在单个查询中获得该结果吗?

我目前的加入基本上是:

从个人 P 中选择 P.ID、P.NAME、P.EMAIL、E.ID、E.DATE,输入 E,其中 P.ID = E.PERSON_ID。

这给出了所有条目的列表,以及关于发布每个条目的人的附加信息。条目表很大,因此可扩展性有些重要。

【问题讨论】:

标签: mysql


【解决方案1】:

您可能想要某种左空连接...但是,我有点困惑。是否有另一个表,每个可能的人只有一行,或者您的意思是您想要一个示例表中至少有 1 行的每个人的列表,但如果上个月没有条目?

假设后者(尽管前者似乎更有可能):

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
;

这基本上是在说“给我一个在过去 30 天内您无法加入该人员 ID 的不同人员 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】:

    我建议将条目表外连接到人员表,并按PERSON_ID 分组。

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

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

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

    【讨论】:

      【解决方案3】:

      假设您的查询类似于

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多