Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询:选择具有扭曲的最新项目_Sql_Mysql - Fatal编程技术网

MySQL查询:选择具有扭曲的最新项目

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

抱歉,标题没有更多帮助。我有一个媒体文件URL数据库,它来自两个来源:

1个RSS提要和2个手动条目

我想找到最近添加的十个URL,但从任何提要中最多只能找到一个。为了简化,表“url”有“url、提要id、时间戳”列

feed_id=用于手动输入的任何URL

我将如何编写查询?请记住,我想要十个最新的URL,但任何一个提要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上有一个索引:


基本上,创建一个临时表,为每个组插入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。