Php 给定一组格式为{FIXED PREFIX}/{NUMERIC ID}/..的URL,如何检索具有最高{NUMERIC ID}的URL?
我想做一个包含艺术家姓名和相应封面视频的查询,这是链接列上的最高ID。在本例中,第二行带有..embd/125/。。。 链接格式永远不会改变。我正在使用PHP、MySQL和innodb引擎 我首先对这两个表进行内部联接: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 | 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/... |
+----+----------+---------------------------------------+