Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.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
Php 给定一组格式为{FIXED PREFIX}/{NUMERIC ID}/..的URL,如何检索具有最高{NUMERIC ID}的URL?_Php_Mysql_Sql_Regex_Innodb - Fatal编程技术网

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

Php 给定一组格式为{FIXED PREFIX}/{NUMERIC ID}/..的URL,如何检索具有最高{NUMERIC ID}的URL?,php,mysql,sql,regex,innodb,Php,Mysql,Sql,Regex,Innodb,我想做一个包含艺术家姓名和相应封面视频的查询,这是链接列上的最高ID。在本例中,第二行带有..embd/125/。。。 链接格式永远不会改变。我正在使用PHP、MySQL和innodb引擎 我首先对这两个表进行内部联接: Id | Artist 1 John Doe 2 Jane Doe 这个呢 Id | Id_Artist | Link 53 1 http://example.com/embd/123/video/... 54 1

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

我首先对这两个表进行内部联接:

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/... 
编辑:

正如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()

如果公共部分始终相同,并且数字的长度也相同,则只需通过以下方式获取字符串的MAX

  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 ) 
否则 你可以替换普通部分。。。并在下一个/ 这样你就可以得到你需要的号码了

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 ) 


我认为正则表达式没有常见的SQL语法风格,但在这种情况下,使用函数
SUBSTR
/
SUBSTRING
可以实现您的目标。所有链接的格式是否相同?您可能会发现将链接id存储在单独的列中是有益的。是的,所有链接都采用相同的格式。不幸的是,我希望在不将链接id存储在searate列的情况下解决此问题。您编写的代码有一个输入错误(来自feed\u post\u Artister而非form feed\u post\u Artister:),我相信您误解了常见部分,即。。。此代码返回的列表与问题中的列表完全相同。公共部分(别名)始终相同?是的,公共部分始终相同。除了ID和末尾的键外,所有链接都相同。示例:ID是123,在emb/之后和/video之前,然后按艺术家选择max link group(最大链接组),您应该在max编号中选择。。我已经更新了答案。。希望是有用的这个解决方案似乎奏效了。虽然结果之间有很多空行,但我还是这样做了。发生这种情况的原因是什么?从哪里得到空值?艺术家?视频?除视频栏目外的所有栏目。我计算了所有艺术家和查询匹配的结果,除了空行,我认为可能是MAX()的丢弃结果(只是猜测),这没有意义。Id\u ArtistI stand corrected的空值不能超过1。Id_艺术家正确,视频列显示视频Id,但艺术家名称为空。这总是返回正确的视频ID:SUBSTRING_INDEX(SUBSTRING_INDEX(gl.link,“/”,5),“/”,-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/... |
+----+----------+---------------------------------------+