对不起,标题没有更多的帮助。我有一个媒体文件URL数据库来自两个来源:
(1)RSS提要和(2)手动输入。
我想找到最近添加的十个网址,但最多只能找到一个网址。为简化起见,表格“urls
”包含'url, feed_id, timestamp'
列。
feed_id=''
。
我该如何编写查询?请记住,我想要十个最新的网址,但只需要一个feed_id
中的一个。
答案 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;