MySQL查询:选择具有扭曲的最新项目
抱歉,标题没有更多帮助。我有一个媒体文件URL数据库,它来自两个来源: 1个RSS提要和2个手动条目 我想找到最近添加的十个URL,但从任何提要中最多只能找到一个。为了简化,表“url”有“url、提要id、时间戳”列 feed_id=用于手动输入的任何URL 我将如何编写查询?请记住,我想要十个最新的URL,但任何一个提要id中只有一个。您可能想要一个。像这样的方法应该会奏效:MySQL查询:选择具有扭曲的最新项目,sql,mysql,Sql,Mysql,抱歉,标题没有更多帮助。我有一个媒体文件URL数据库,它来自两个来源: 1个RSS提要和2个手动条目 我想找到最近添加的十个URL,但从任何提要中最多只能找到一个。为了简化,表“url”有“url、提要id、时间戳”列 feed_id=用于手动输入的任何URL 我将如何编写查询?请记住,我想要十个最新的URL,但任何一个提要id中只有一个。您可能想要一个。像这样的方法应该会奏效: (SELECT url, feed_id, timestamp FROM rss
(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上有一个索引:
基本上,创建一个临时表,为每个组插入top K,从表中选择,然后删除表。通过这种方式,您可以从LIMIT子句中获得提前终止的好处。按您希望区分的字段分组是否有效
按feedid顺序按时间戳DESC LIMIT 10从url组中选择url、feedid 假设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”列的增强功能是什么?两个表之间的提要id是通用的吗?只有1个表,2个源。假设您需要多个手动输入的项目,每个提要id可能有1个重复。如果您按提要id分组,则无法选择url、提要id、时间戳,您必须使用一些聚合函数来处理您没有分组的内容,即url和时间戳,这是正确的。第二次选择最多返回一行,因为在手动进纸的情况下,进纸id始终为。要清楚的是,只有一张表。假设我是对的,只有一张表,我认为这是一个可行的解决方案。我试过类似的方法,但它最多只返回一个没有提要的url。在这种情况下,您可以执行类似以下操作:从表中选择maxid中的where id,在where feed\u id group by feed\u id中,您可以发布具有预期结果的示例sql定义吗?为什么?假设每个项目的url不同,您如何知道此url将是与最近日期匹配的url?这会将最后10个条目合并,而不考虑复制源与最后10个按源id排序的条目,这对提供所需结果没有任何作用。西撒特派团完成了什么。我不认为这会起作用。西撒特派团有点棘手,它确保如果我们有两个相同日期的项目,我们通过url排序打破联系,这有点罕见,你也可以使用maxid打破联系。我认为最新版本中的subselect可能有点慢,有100000多个feed_id。它也有限制吗?那么第一个FROM中的‘p’是什么?我扩展了我的答案来涵盖它。这是一个很好的答案,比公认的答案更具普遍性,因为答案依赖于一个自动递增的id。