2

如何编写一个 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

4

2 回答 2

3

未经测试,但接近:

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
于 2012-09-18T21:07:43.687 回答
0

这是一种方法,使用内联视图(或 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
于 2012-09-18T21:22:33.323 回答