给定一组 FIXED PREFIX/NUMERIC ID/... 格式的 URL,如何检索具有最高 NUMERIC ID 的 URL?

Posted

技术标签:

【中文标题】给定一组 FIXED PREFIX/NUMERIC ID/... 格式的 URL,如何检索具有最高 NUMERIC ID 的 URL?【英文标题】:Given a set of URL in the format FIXED PREFIX/NUMERIC ID/..., how to retrieve the URL with the highest NUMERIC ID?给定一组 FIXED PREFIX/NUMERIC ID/... 格式的 URL,如何检索具有最高 NUMERIC ID 的 URL? 【发布时间】:2017-06-17 02:08:34 【问题描述】:

我想查询包含艺术家姓名和相应的封面视频,这是链接列上的最高 ID。在本例中,第二行带有 ..embd/125/... 链接格式永远不会改变。我正在使用 phpmysql 和 innodb 引擎

我首先对这两个表进行了 INNER JOIN:

Id | Artist
1    John Doe
2    Jane Doe

还有这个

Id | Id_Artist | Link 
53   1           http://example.com/embd/123/video/...
54   1           http://example.com/embd/125/video/...
55   1           http://example.com/embd/124/video/...   
56   1           http://example.com/embd/122/video/... 
57   2           http://example.com/embd/128/video/...
58   2           http://example.com/embd/129/video/...    
59   2           http://example.com/embd/130/video/...  

与所有艺术家一起输出预期结果,他们是视频

SELECT fp.id, fp.name, gl.link AS Video
FROM feed_post_artist AS fp
INNER JOIN gallery gl ON gl.id_artist = fp.id

Id | Id_Artist | Link 
 1   John Doe    http://example.com/embd/123/video/...
 1   John Doe    http://example.com/embd/125/video/...
 1   John Doe    http://example.com/embd/124/video/...   
 1   John Doe    http://example.com/embd/122/video/... 
 2   Jane Doe    http://example.com/embd/128/video/...
 2   Jane Doe    http://example.com/embd/129/video/...    
 2   Jane Doe    http://example.com/embd/130/video/... 

是否可以使用正则表达式来比较每个艺术家视频并仅返回最高的链接 ID 作为结果? (前 4 行 125 最高,后 3 行 130 最高)。我曾尝试使用 MAX() 但显然它不起作用。

Id | Id_Artist | Link 
 1   John Doe    http://example.com/embd/125/video/...
 2   Jane Doe    http://example.com/embd/130/video/... 

编辑:

正如 cmets 中的 Julian 所建议的,MySQL SUBSTR() 解决了这种特殊情况。但是,当 id 超过 999 时,它将停止工作。

SELECT fp.id, fp.name, SUBSTR(gl.link,28,5) AS Video
FROM feed_post_artist AS fp
INNER JOIN gallery gl ON gl.id_artist = fp.id

唯一缺少的部分是将结果分组以仅返回 MAX()

【问题讨论】:

我认为正则表达式在常见的 SQL 语法风格中不可用,但在这种情况下,您可以使用函数 SUBSTR/SUBSTRING 来实现您的目标。 所有链接的格式都一样吗?您可能会发现将链接 ID 存储在单独的列中会有所帮助。 是的,链接格式都是一样的。不幸的是,我希望在不将链接 ID 存储在 searate 列中的情况下解决此问题。 【参考方案1】:
select      a.Id
           ,a.Artist
           ,g.Link

from                    feed_post_artist    as a

            left join  (select      Id_Artist
                                   ,substr(max(concat(lpad(substring_index(substring_index(Link,'/',5),'/',-1),10,'0'),Link)),11)   as Link  

                        from        gallery as g

                        group by    Id_Artist
                        ) g

            on          g.Id_Artist =
                        a.Id

order by    a.Id                               

+----+----------+---------------------------------------+
| Id | Artist   | Link                                  |
+----+----------+---------------------------------------+
| 1  | John Doe | http://example.com/embd/125/video/... |
+----+----------+---------------------------------------+
| 2  | Jane Doe | http://example.com/embd/130/video/... |
+----+----------+---------------------------------------+

【讨论】:

这个解决方案似乎有效。我虽然在结果之间有很多 NULL 行。为什么会发生这种情况? 你从哪里得到 NULL?艺术家?视频? 除视频列之外的每一列。我计算了艺术家总数和查询匹配的结果,除了我认为可能是 MAX () 丢弃的结果的 NULL 行(只是猜测) 这没有意义。您不能为 Id_Artist 获得超过 1 个 NULL 我的立场是正确的。 Id_Artist 是正确的,视频列显示 videoid 但艺术家名称为 NULL 。这总是返回正确的视频 ID: SUBSTRING_INDEX(SUBSTRING_INDEX(gl.link,'/',5),'/',-1) 。我现在缺少的是一种将这些结果分组并仅返回最大值以及艺术家姓名和其他一些列的方法【参考方案2】:

如果公共部分始终相同并且数字的长度也相同,您可以简单地通过

获得字符串组的最大值
  SELECT fp.id, fp.name, gl.link AS Video
  FROM feed_post_artist AS fp
  INNER JOIN gallery gl ON gl.id_artist = fp.id
  where ( gl.artist_id,gl.link)  in 
        ( select artist_id,  max(link) ) 
           from feed_post_artist 
           group by artist_id ) 

否则 您可以替换公共部分 http://example.com/embd/123/video/... 并在下一个 / 之前获取字符串部分 有了这个你应该得到你需要的号码

substr( replace(link, 'http://example.com/embd/' , '' ), 
    locate(replace(link, 'http://example.com/embd/' , '' ), '/', 1))

所以你可以使用一个元组来匹配按艺术家 ID 分组的数字的最大值,正确地转换为 int

  SELECT fp.id, fp.name, gl.link AS Video
  FROM feed_post_artist AS fp
  INNER JOIN gallery gl ON gl.id_artist = fp.id
  where ( gl.artist_id, 
      cast(  substr( replace(link, 'http://example.com/embd/' , '' ), 
    locate(replace(link, 'http://example.com/embd/' , '' ), '/', 1)) ) AS UNSIGNED)  in 
        ( select artist_id, 
           max(   CAST(substr( replace(link, 'http://example.com/embd/' , '' ), 
              locate(replace(link, 'http://example.com/embd/' , '' ), '/', 1)) 
          ) AS UNSIGNED)
           from feed_post_artist 
           group by artist_id ) 

【讨论】:

您编写的代码有错字(来自 feed_post_artist 而不是来自 feed_post_artist :))我相信您误会了 example.com/embd/ID-HERE/video 的共同部分...此代码返回的列表与该代码完全相同在问题中 公共部分(别名'example.com/embd)总是一样的? 是的,共同的部分总是一样的。 所有链接都一样,除了ID和最后一个key。示例:example.com/embd/123/video/234fh1jjd123dasf ID 是 123,在 emb/ 之后和 /video 之前 然后选择艺术家的最大链接组,您应该获得最大编号..我已经更新了答案..希望有用

以上是关于给定一组 FIXED PREFIX/NUMERIC ID/... 格式的 URL,如何检索具有最高 NUMERIC ID 的 URL?的主要内容,如果未能解决你的问题,请参考以下文章

给定一组 ID,返回仅具有这些 ID 的订单子集

给定一组正数,找出最接近给定常数的加法组合?

给定一组数字,返回所有其他数字的产品数组(无分区)

给定一组带有线段的点,找到等距的点

在给定一组地理坐标的情况下获取友好的位置名称?

给定一组参数,如何将这些参数发送到 Ruby 中的特定函数?