PHP-программист
Приглашаю для постоянного удаленного сотрудничества опытного PHP-программиста, которому по душе идея yaliti.com
Кто хочет, может решить следующую задачку.
Имеется некая функция «Какой трек играть?».
В общем она выглядит вот так, как описано ниже.
А как бы вы её написали, как бы использовали индексы, изменили бы что-то?
1. Проверяем, есть ли в принципе хотя бы одна песня, удовлетворяющая настройкам.
$id =
SELECT s.id FROM songs s
LEFT JOIN songs_filters sf ON sf.song_id = s.id
WHERE
sf.filter_id = 1607 // Трек в эфире
AND
sf.song_id NOT IN (select song_id FROM songs_filters where filter_id = 1606) // Кроме тех, которые на модерации
AND
sf.song_id IN (select song_id FROM songs_filters where filter_id IN ('1, 2, 3, 4')) // И, у которых выбран один и фильтров
AND
sf.song_id IN (select song_id FROM songs_filters where filter_id IN ('669, 670, 671, 673')) // И, у которых выбран один и фильтров
AND
sf.song_id IN (select song_id FROM songs_filters where filter_id IN ('1230, 1231, 1233')) // И, у которых выбран один и фильтров
LIMIT 1
Если поиск не дал результата: «По выбранным фильтрам треков не найдено. Вы можете попробовать изменить настройки радио.»
2. Если есть, то выбираем самую свежу песню, соответствующую настройкам, которую я ни разу еще не слышал.
$id =
SELECT MAX ( s.id ) FROM songs s
LEFT JOIN songs_filters sf ON sf.song_id = s.id
WHERE
sf.filter_id = 1607 // Трек в эфире
AND
sf.song_id NOT IN (select song_id FROM songs_filters where filter_id = 1606) // Кроме тех, которые на модерации
AND
sf.song_id IN (select song_id FROM songs_filters where filter_id IN ('1, 2, 3, 4'))
AND
sf.song_id IN (select song_id FROM songs_filters where filter_id IN ('669, 670, 671, 673'))
AND
sf.song_id IN (select song_id FROM songs_filters where filter_id IN ('1230, 1231, 1233'))
AND
s.id NOT IN (
SELECT song_id
FROM songs_listening_history slh
WHERE slh.user_id = 2
)
LIMIT 1
3. Если таких нет, то выбираем песню, прослушанную мной давнее всего, соответствующую настройкам.
$my_last_listening =
select min(slh.my_last_listening) FROM songs_listening_history slh
LEFT JOIN songs_filters sf ON sf.song_id=slh.song_id
WHERE
slh.user_id=2
AND
slh.my_rating>=0
AND
sf.filter_id = 1607 // Трек в эфире
AND
sf.song_id NOT IN (select song_id FROM songs_filters where filter_id = 1606) // Кроме тех, которые на модерации
AND
sf.song_id IN (select song_id FROM songs_filters where filter_id IN ('1, 2, 3, 4'))
AND
sf.song_id IN (select song_id FROM songs_filters where filter_id IN ('669, 670, 671, 673'))
AND
sf.song_id IN (select song_id FROM songs_filters where filter_id IN ('1230, 1231, 1233'))
LIMIT 1
select slh.song_id, s.user_id, u.folder_id FROM songs_listening_history slh
LEFT JOIN songs s ON s.id = slh.song_id
LEFT JOIN users u ON u.id = slh.user_id
where slh.my_last_listening=$my_last_listening and slh.user_id=2
Если поиск не дал результата: «По выбранным фильтрам треков не найдено. Вы можете попробовать изменить настройки радио.»
Если трек найден, то происходит переадресация на УРЛ вида http://yaliti.com/radio/track/$folder_name/$track_id