【问题标题】:MySQL select only new recordsMySQL 只选择新记录
【发布时间】:2012-09-18 21:03:07
【问题描述】:

如何编写一个 MySQL 查询来完成这个任务?

表格:作家

w_id    w_name
---------------
  1     Michael
  2     Samantha
  3     John
---------------

表格:文章

a_id   w_id   timestamp   a_name
----------------------------------------
  1      1    0000000001  PHP programming
  2      3    0000000003  Other programming languages
  3      3    0000000005  Another article
  4      2    0000000015  Web design
  5      1    0000000020  MySQL
----------------------------------------

只需要选择不早于0000000005发表第一篇文章的作者。
(只能选择至少发表过一篇文章的作者)

在此示例中,结果将是:

  2     Samantha

SQL代码可以在这里测试http://sqlfiddle.com/#!2/7a308

【问题讨论】:

  • 为什么不将1 Michael 包含在结果中?据我所知,Michael 写了一篇时间戳为 0000000020 的文章。
  • 是的,但他的第一篇文章是在0000000001上,比0000000005早。所以他不应该被列入结果列表。

标签: mysql sql select


【解决方案1】:

未经测试,但接近:

SELECT w_id, MIN(timestamp) as min_time
from writers w
JOIN articles a on w.w_id = a.w_id
GROUP BY 1
HAVING min_time > 5

【讨论】:

  • “减 1。我的生活故事!”我不明白。
  • 好吧,@pilcrow 指出我使用了 ">" 而不是 ">=",这会使答案变成“fby one”。从哲学上讲,我发现你在生活中也可以“一帆风顺”——早/晚、快乐/悲伤等。哦,有趣/不好玩:)
【解决方案2】:

这是一种方法,使用内联视图(或 MySQL 称之为“派生表”)来获取每个写入器的最早时间戳:

SELECT w.w_id
     , w.w_name
   --  , e.earliest_timestamp
  FROM writers w
  LEFT
  JOIN ( SELECT a.w_id
              , MIN(a.timestamp) AS earliest_timestamp
           FROM articles a
          GROUP BY a.w_id
       ) e
    ON e.w_id = w.w_id
 WHERE e.earliest_timestamp >= '0000000005'
 ORDER BY w.w_id

这可能不是最有效的方法,但您可以只在内联视图(别名为 e)中运行查询以查看它返回的内容。然后,我们可以像处理表一样引用该查询的结果集(有一些限制)。

(其他方法可以更好地利用合适的索引。)

我不清楚earliest_timestamp 列的数据类型。上面的 SQL 假定它是字符数据类型。如果它是整数而不是字符,则 WHERE 子句可能如下所示:

 WHERE e.earliest_timestamp >= 5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-07
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    相关资源
    最近更新 更多