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