2012-09-18 183 views
2

如何编写一个MySQL查询来实现这个任务?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 
---------------------------------------- 

需要选择只有那些谁发表了他们的第一篇文章不早于作家。
(仅谁发表至少一篇文章可以选择作家)

在这个例子中,结果将是:

2  Samantha 

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

+0

为什么在结果中不包含“1 Michael”?从我看到的情况来看,Michael写了一篇文章,时间戳为0000000020. –

+1

是的,但他的第一篇文章是在0000000001之前,比0000000005早。所以他不应该被包含在结果列表中。 – acoder

回答

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 
+1

+1我觉得你想'HAVING min_time> = 5' – pilcrow

+1

Off by 1.我的生活故事! –

+0

“Off by 1.我的生活故事!”我不明白。 – fancyPants

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