2017-01-31 4 views
3

Я хочу сделать запрос, содержащий имя исполнителя и соответствующее видео обложки, которое является наивысшим идентификатором в столбце ссылки. В этом примере вторая строка с .embd// ... Формат ссылки не изменяется. Я использую PHP, MySQL и InnoDB двигательУчитывая набор URL-адресов в формате {FIXED PREFIX}/{NUMERIC ID}/..., как получить URL с наивысшим {NUMERIC ID}?

Я начал делать внутреннее соединение этих двух таблиц:

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/... 

Можно ли использовать регулярное выражение для сравнения каждого видео исполнителя и вернуть в итоге только самый высокий идентификатор ссылки? (Первые 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/... 

EDIT:

Как Юлиана в комментариях предложил, 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()

+0

Я не думаю, что регулярные выражения доступны в общих синтаксических синтаксисах SQL, но вы могли бы достичь своей цели в этом случае, используя функцию 'SUBSTR' /' SUBSTRING'. – Julian

+0

Все ли ссылки в том же формате? Возможно, вам будет полезно сохранить идентификатор ссылки в отдельной колонке. – Jerrad

+0

Да, все ссылки в одном формате. К сожалению, я искал решение этой проблемы, не сохраняя идентификатор ссылки в обгоревшем столбце. – Cracktastic

ответ

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/... | 
+----+----------+---------------------------------------+ 
+0

Это решение работает. Я получаю много строк NULL между результатами. Любая причина, почему это происходит? – Cracktastic

+0

Где вы получаете NULL? Исполнитель? Видео? –

+0

Каждая колонка, кроме столбца видео. Я подсчитал общее количество исполнителей и результаты совпадения запросов, за исключением строк NULL, которые, я считаю, могут быть отброшенными результатами MAX() (просто гадание) – Cracktastic

0

если общая часть всегда одинакова и длина номера одно и то же вы тоже могли бы просто получить максимальную для струнной группы по

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 правильно отлиты в качестве ИНТ

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) 
+0

Код, который вы написали, имеет опечатку (from feed_post_artist not form feed_post_artist :)) Я считаю, что вы ошибаетесь в общей части, которая является http: //example.com/embd/ID-HERE/video/... Этот код возвращает то же самое, что и в вопросе – Cracktastic

+0

общая часть (псевдоним «http://example.com/embd/) всегда такая же? – scaisEdge

+0

Как бы то ни было, у меня есть ответ – scaisEdge