MySQL查询:选择最近的项目

时间:2008-09-23 00:50:15

标签: sql mysql

对不起,标题没有更多的帮助。我有一个媒体文件URL数据库来自两个来源:

(1)RSS提要和(2)手动输入。

我想找到最近添加的十个网址,但最多只能找到一个网址。为简化起见,表格“urls”包含'url, feed_id, timestamp'列。

对于手动输入的任何网址,

feed_id=''

我该如何编写查询?请记住,我想要十个最新的网址,但只需要一个feed_id中的一个。

6 个答案:

答案 0 :(得分:3)

假设feed_id = 0是手动输入的东西,这就是诀窍:

select p.* from programs p
left join 
(
    select max(id) id1 from programs
    where feed_id <> 0
    group by feed_id
    order by max(id) desc
    limit 10
) t on id1 = id
where id1 is not null or feed_id = 0 
order by id desc
limit 10;

它的工作原因是id列不断增加,它也非常快。 t是表别名。

这是我原来的答案:

(
select 
    feed_id, url, dt 
    from feeds  
    where feed_id = ''
    order by dt desc 
    limit 10
)
union
(

select feed_id, min(url), max(dt) 
        from feeds
        where feed_id <> '' 
        group by feed_id
        order by dt desc    
        limit 10
)
order by dt desc
limit 10

答案 1 :(得分:3)

假设这个表

  CREATE TABLE feed (
  feed varchar(20) NOT NULL,
  add_date datetime NOT NULL,
  info varchar(45) NOT NULL,
  PRIMARY KEY  (feed,add_date);

此查询应该执行您想要的操作。内部查询按Feed选择最后一个条目并选择最近的10条,然后外部查询返回这些条目的原始记录。

  select f2.*
  from (select feed, max(add_date) max_date
          from feed f1
         group by feed
         order by add_date desc
         limit 10) f1
  left join feed f2 on f1.feed=f2.feed and f1.max_date=f2.add_date;

答案 2 :(得分:1)

这是(缩写)表:

CREATE TABLE programs (
  id int(11) NOT NULL auto_increment,
  feed_id int(11) NOT NULL,
  `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (id)
) ENGINE=InnoDB;

这是我基于sambo99概念的查询:

(SELECT feed_id,id,timestamp 
    FROM programs WHERE feed_id='' 
    ORDER BY timestamp DESC LIMIT 10)
UNION
    (SELECT feed_id,min(id),max(timestamp) 
    FROM programs WHERE feed_id<>'' GROUP BY feed_id 
    ORDER BY timestamp DESC LIMIT 10)
ORDER BY timestamp DESC LIMIT 10;

似乎工作。需要更多测试,但至少我理解它。 (好事!)使用“id”列增强了什么?

答案 3 :(得分:0)

您可能需要union。这样的事情应该有效:

    (SELECT 
        url, feed_id, timestamp 
    FROM rss_items  
    GROUP BY feed_id 
    ORDER BY timestamp DESC 
    LIMIT 10)
UNION
    (SELECT 
        url, feed_id, timestamp 
    FROM manual_items  
    GROUP BY feed_id 
    ORDER BY timestamp DESC 
    LIMIT 10)
ORDER BY timestamp DESC
LIMIT 10

答案 4 :(得分:0)

MySQL对这种类型的查询没有最大的支持。

您可以使用“GROUP-BY”和“HAVING”子句的组合来执行此操作,但是您将扫描整个表格,这会花费很多。

假设您有一个关于组ID的索引,这里发布了一个更有效的解决方案: http://www.artfulsoftware.com/infotree/queries.php?&bw=1390#104

(基本上,创建一个临时表,插入每个组的顶部K,从表中选择,删除表。这样你就可以从LIMIT子句中获得提前终止的好处。)

答案 5 :(得分:0)

是否可以根据您希望区分的字段进行分组?

SELECT url,feedid FROM urls GROUP BY feedid ORDER BY timestamp DESC LIMIT 10;