Tam faktycznie można było sobie odpuścić tabele ile_grane i wrzucić te dane w tabele utwor i tak tez zrobiłem, ale trochę zmieniłem koncepcje i teraz w oddzielnej tabeli 'kiedygrane' trzymam dane na temat statystyk kiedy był grany dany utwór
CREATE TABLE IF NOT EXISTS `kiedygrane` (
`kg_id` int(11) NOT NULL AUTO_INCREMENT,
`utwor_id` int(11) NOT NULL,
`datetime` datetime NOT NULL,
`type` int(11) NOT NULL,
PRIMARY KEY (`kg_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=7 ;
INSERT INTO `kiedygrane` (`kg_id`, `utwor_id`, `datetime`, `type`) VALUES
(1, 7, '2013-11-03 06:00:00', 0),
(2, 6, '2013-11-12 10:24:15', 0),
(3, 3, '2013-11-25 00:00:00', 1),
(4, 6, '2013-11-11 15:22:47', 0),
(5, 4, '2013-11-11 17:52:47', 1),
(6, 1, '2013-11-16 17:52:47', 0);
CREATE TABLE IF NOT EXISTS `utwory` (
`utwor_id` int(11) NOT NULL AUTO_INCREMENT,
`wykonawca_id` int(11) NOT NULL,
`tytul` varchar(255) COLLATE utf8_polish_ci NOT NULL,
`ile_grane` int(11) NOT NULL DEFAULT '0',
`pierwszy_raz` datetime DEFAULT NULL,
`uwagi` text COLLATE utf8_polish_ci,
PRIMARY KEY (`utwor_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=8 ;
INSERT INTO `utwory` (`utwor_id`, `wykonawca_id`, `tytul`, `ile_grane`, `pierwszy_raz`, `uwagi`) VALUES
(1, 1, 'Tytuł utworu 1', 0, NULL, NULL),
(2, 7, 'Tytuł utworu 2', 0, NULL, NULL),
(3, 5, 'Tytuł utworu 3', 0, NULL, NULL),
(4, 3, 'Tytuł utworu 4', 0, NULL, NULL),
(5, 5, 'Tytuł utworu 5', 0, NULL, NULL),
(6, 6, 'Tytuł utworu 6', 0, NULL, NULL),
(7, 2, 'Tytuł utworu 7', 0, NULL, NULL);
CREATE TABLE IF NOT EXISTS `wykonawcy` (
`wykonawca_id` int(11) NOT NULL AUTO_INCREMENT,
`wykonawca` varchar(255) COLLATE utf8_polish_ci NOT NULL,
PRIMARY KEY (`wykonawca_id`),
UNIQUE KEY `wykonawca` (`wykonawca`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=9 ;
INSERT INTO `wykonawcy` (`wykonawca_id`, `wykonawca`) VALUES
(1, 'Wykonawca 1'),
(2, 'Wykonawca 2'),
(3, 'Wykonawca 3'),
(4, 'Wykonawca 4'),
(5, 'Wykonawca 5'),
(6, 'Wykonawca 6'),
(7, 'Wykonawca 7'),
(8, 'Wykonawca 8');
poniższe zapytanie chyba działa ok, ale pytanie czy jest optymalne, bo w oryginale ma działać na dużo większej bazie, każda z tabel ma więcej kolumn (utwory: ~25000 rekordów; wykonawcy:~7000 rekordów; kiedygrane:~120000 rekordów)
SELECT u.tytul,w.wykonawca,kg.datetime FROM utwory AS u INNER JOIN wykonawcy AS w ON u.wykonawca_id = w.wykonawca_id INNER JOIN kiedygrane AS kg ON u.utwor_id = kg.utwor_id WHERE type = 1 ORDER BY datetime ASC
Wynik zapytania wyeksportowany do tablicy php:
array('tytul'=>'Tytuł utworu 4','wykonawca'=>'Wykonawca 3','datetime'=>'2013-11-11 17:52:47'), array('tytul'=>'Tytuł utworu 3','wykonawca'=>'Wykonawca 5','datetime'=>'2013-11-25 00:00:00') );