给定一组格式为 {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}?
我想查询包含艺术家姓名和相应的封面视频,这是 Link 列中的最高 ID。在此示例中,第二行带有 ..embd/125/...
link 格式永远不会改变。我正在使用 PHP ,MySQL 和 innodb engine
我首先对这两个表进行了 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/...
是否可以使用正则表达式来比较每个艺术家的视频,并且 return 只比较最高的 link 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/...
编辑:
正如朱利安在评论中所建议的那样,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
唯一缺少的部分是将结果分组到 return 只有 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 )
否则
您可以替换公共部分 http://example.com/embd/123/video/... 并在下一个 / 之前获取字符串部分
有了这个你应该得到你需要的号码
substr( replace(link, 'http://example.com/embd/' , '' ),
locate(replace(link, 'http://example.com/embd/' , '' ), '/', 1))
所以你可以使用一个元组来匹配由 artist_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 )
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/... |
+----+----------+---------------------------------------+
我想查询包含艺术家姓名和相应的封面视频,这是 Link 列中的最高 ID。在此示例中,第二行带有 ..embd/125/... link 格式永远不会改变。我正在使用 PHP ,MySQL 和 innodb engine
我首先对这两个表进行了 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/...
是否可以使用正则表达式来比较每个艺术家的视频,并且 return 只比较最高的 link 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/...
编辑:
正如朱利安在评论中所建议的那样,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
唯一缺少的部分是将结果分组到 return 只有 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 )
否则 您可以替换公共部分 http://example.com/embd/123/video/... 并在下一个 / 之前获取字符串部分 有了这个你应该得到你需要的号码
substr( replace(link, 'http://example.com/embd/' , '' ),
locate(replace(link, 'http://example.com/embd/' , '' ), '/', 1))
所以你可以使用一个元组来匹配由 artist_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 )
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/... |
+----+----------+---------------------------------------+