MySQL查询:选择最近的项目
时间:2020-03-06 14:34:27 来源:igfitidea点击:
抱歉,标题没有更多帮助。我有一个来自两个来源的媒体文件URL数据库:
(1)RSS提要和(2)手册条目。
我想找到最近添加的十个URL,但任何提要中最多可以找到一个。为了简化,表" urls"具有列" url,feed_id,timestamp"。
" feed_id ="`,用于手动输入的任何网址。
我将如何编写查询?记住,我想要十个最近的URL,但是任何单个" feed_id"中只有一个。
解决方案
我们可能想要一个工会。这样的事情应该起作用:
(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
MySQL对这种查询没有最大的支持。
我们可以结合使用" GROUP-BY"和" HAVING"子句来完成此操作,但是我们将扫描整个表,这可能会增加成本。
假设我们在组ID上有一个索引,这里发布了一个更有效的解决方案:
http://www.artfulsoftware.com/infotree/queries.php?&bw=1390#104
(基本上,创建一个临时表,将每个组的前K个插入其中,从表中选择,然后删除表。这样,我们可以从LIMIT子句中尽早终止。)
按我们要区分的字段分组是否可行?
SELECT url,feedid from urls GROUP BY feedid ORDER BY timestamp DESC LIMIT 10;
假设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
假设这张桌子
CREATE TABLE feed ( feed varchar(20) NOT NULL, add_date datetime NOT NULL, info varchar(45) NOT NULL, PRIMARY KEY (feed,add_date);
这个查询应该做你想要的。内部查询按提要选择最后一个条目,并选择最近的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;
这是(缩写)表:
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"列有什么增强?