W tej chwili mam taką strukturę bazy:
Kod
--
-- Struktura tabeli dla tabeli `playlist`
--
CREATE TABLE IF NOT EXISTS `playlist` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`znacznik_czasu` int(10) unsigned NOT NULL,
`track_id` int(11) unsigned NOT NULL,
`radio_id` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `CzasRadioID` (`znacznik_czasu`,`radio_id`),
KEY `radioID` (`radio_id`),
KEY `SongID` (`track_id`),
KEY `ts` (`znacznik_czasu`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3224080;
--
-- Ograniczenia dla tabeli `playlist`
--
ALTER TABLE `playlist`
ADD CONSTRAINT `playlist_ibfk_1` FOREIGN KEY (`radio_id`) REFERENCES `stations` (`radio_id`) ON UPDATE CASCADE,
ADD CONSTRAINT `playlist_ibfk_2` FOREIGN KEY (`track_id`) REFERENCES `tracks` (`track_id`) ON DELETE CASCADE ON UPDATE CASCADE;
--
-- Struktura tabeli dla tabeli `artists`
--
CREATE TABLE IF NOT EXISTS `artists` (
`artist_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`hash` char(32) NOT NULL,
PRIMARY KEY (`artist_id`),
UNIQUE KEY `hash` (`hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=10988;
--
-- Struktura tabeli dla tabeli `tracks`
--
CREATE TABLE IF NOT EXISTS `tracks` (
`track_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`artist_id` int(10) unsigned NOT NULL,
`hash` char(32) NOT NULL,
PRIMARY KEY (`track_id`),
UNIQUE KEY `hash` (`hash`),
KEY `artist_id` (`artist_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=47976;
--
-- Ograniczenia dla tabeli `tracks`
--
ALTER TABLE `tracks`
ADD CONSTRAINT `tracks_ibfk_1` FOREIGN KEY (`artist_id`) REFERENCES `artists` (`artist_id`) ON UPDATE CASCADE;
--
-- Struktura tabeli dla tabeli `stations`
--
CREATE TABLE IF NOT EXISTS `stations` (
`radio_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(60) NOT NULL,
PRIMARY KEY (`radio_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=162;
-- Struktura tabeli dla tabeli `playlist`
--
CREATE TABLE IF NOT EXISTS `playlist` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`znacznik_czasu` int(10) unsigned NOT NULL,
`track_id` int(11) unsigned NOT NULL,
`radio_id` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `CzasRadioID` (`znacznik_czasu`,`radio_id`),
KEY `radioID` (`radio_id`),
KEY `SongID` (`track_id`),
KEY `ts` (`znacznik_czasu`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3224080;
--
-- Ograniczenia dla tabeli `playlist`
--
ALTER TABLE `playlist`
ADD CONSTRAINT `playlist_ibfk_1` FOREIGN KEY (`radio_id`) REFERENCES `stations` (`radio_id`) ON UPDATE CASCADE,
ADD CONSTRAINT `playlist_ibfk_2` FOREIGN KEY (`track_id`) REFERENCES `tracks` (`track_id`) ON DELETE CASCADE ON UPDATE CASCADE;
--
-- Struktura tabeli dla tabeli `artists`
--
CREATE TABLE IF NOT EXISTS `artists` (
`artist_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`hash` char(32) NOT NULL,
PRIMARY KEY (`artist_id`),
UNIQUE KEY `hash` (`hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=10988;
--
-- Struktura tabeli dla tabeli `tracks`
--
CREATE TABLE IF NOT EXISTS `tracks` (
`track_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`artist_id` int(10) unsigned NOT NULL,
`hash` char(32) NOT NULL,
PRIMARY KEY (`track_id`),
UNIQUE KEY `hash` (`hash`),
KEY `artist_id` (`artist_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=47976;
--
-- Ograniczenia dla tabeli `tracks`
--
ALTER TABLE `tracks`
ADD CONSTRAINT `tracks_ibfk_1` FOREIGN KEY (`artist_id`) REFERENCES `artists` (`artist_id`) ON UPDATE CASCADE;
--
-- Struktura tabeli dla tabeli `stations`
--
CREATE TABLE IF NOT EXISTS `stations` (
`radio_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(60) NOT NULL,
PRIMARY KEY (`radio_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=162;
W tabeli tracks trzymam między innymi tytuł utworu i id artysty (id powiązany z id artysty w tabeli artists)
W tabeli artists trzymam dane artystów
W tabeli stations trzymam dane o stacji radiowej
W tabeli playlist trzymam czas odtworzenia, id utworu z tabeli tracks, i id stacji z tabeli stations
Chce na stronie zrobić bloki z wszystkimi stacjami i W każdym bloku 5 ostatnio zagranych utworów. W jaki sposób mogę z takiej struktury wyciągnąć 5 ostatnich utworów (wg znacznik_czasu) dla każdego radio_id z tabeli playlist? dla każdego track_id chciałbym dostać w każdym rekordzie
Kod
playlist.radio_id, playlist.znacznik_czasu, playlist.track_id, tracks.title, tracks.artist_id, artists.name
Mogę prosić o pomoc w zbudowaniu (lub zbudowanie) zapytania wyciągającego potrzebne mi dane? bo sam chyba tego nie ogarnę

Dla jednej konkretnej stacji sobie wyciągnę te dane (5 ostatnich po playlist.znacznik_czasu i radio_id) bez problemu, ale nie wiem jak, nie umiem ograniczyć do 5 ostatnich dla każdego radio_id, i zrobić to w jednym zapytaniu.
Dane zbierane są na bieżąco cronem od stycznia i playlista ma już blisko 3 miliony rekordów. Zastanawiam się czy np nie rozdzielić playlisty na dwie tabele. "1" - ostatnie X czasu (np. 2 miesiące), "2" - reszta, i aktualizować co noc cronem przenosząc starsze rekordy do tabeli "2", i usuwając te starsze z tabeli "1". Odciążyłbym chyba tym samym tabelę "1" z bieżącymi danymi, do "2" z historycznymi danymi, jest rzadka potrzeba zaglądania. Czy to dobry pomysł?