MYSQL LEFT JOIN возвращает все данные как NULL

#mysql #sql #datetime #left-join #greatest-n-per-group

#mysql #sql #дата и время #левое соединение #наибольшее-n-на-группу

Вопрос:

Моя версия mysql — 5.7.32.

Я понимаю, что об этом спрашивали много раз, и я перепробовал много сообщений, но безуспешно. Заранее благодарю вас.

На данный момент это мой запрос, который возвращает все из LEFT JOIN как NULL.

         SELECT %playlists%.*, tracks.*
        FROM %playlists%
        LEFT JOIN (
            SELECT *
            FROM %tracks%
            ORDER BY timestamp DESC
            LIMIT 1
        ) AS tracks ON tracks.id_playlist=%playlists%.id
        WHERE %playlists%.owner='.$id_owner.'
        ORDER BY %playlists%.name ASC
  

Мои таблицы ex

 %playlist%
name           |id |owner|
relaxing music | 1 | 3   |

%tracks%
id_playlist|timestamp |tracks|
   1       |1234958574| 200
   1       |1293646887| 300
  

Я хочу включить последнюю временную метку из%tracks%

Ответ №1:

Я хочу включить последнюю временную метку из%tracks%

В MySQL 5.7 я бы рекомендовал фильтровать left join с помощью коррелированного подзапроса, который выводит последние timestamp данные для текущего списка воспроизведения:

 select p.*, t.timestamp, t.tracks
from playlists p
left join tracks t 
    on  t.id_playlist = p.id
    and t.timestamp = (select max(t1.timestamp) from tracks t1 where t1.id_playlist = p.id)
where p.owner = ?
order by p.name
  

Обратите внимание, что я удалил знаки процента вокруг имен таблиц (это недопустимый SQL) и что я использовал псевдонимы таблиц ( p и t ), которые облегчают запись и чтение запроса. Я также использовал заполнитель ( ? ) для представления параметра запроса; объединение переменных в строке запроса — плохая практика, следует отдавать предпочтение подготовленным операторам.

Комментарии:

1. Спасибо, это сработало. Я не знал, что могу использовать такие ярлыки. Большое спасибо! 🙂