Cośtam wiem, ale nie jestem orzeł w pracy z bazami i potrzebuję porady kogoś bardziej doświadczonego.
Mam przykładowe (i znacznie uproszczone na potrzeby mojego pytania) tabele w bazie danych:
CREATE TABLE `artykul` ( `ida` INT UNSIGNED NOT NULL , `data` DATETIME NOT NULL DEFAULT '2000-01-01 00:00:01', `tytul` VARCHAR(20) NOT NULL, PRIMARY KEY (`ida`) ) ENGINE = MYISAM ; CREATE TABLE `kategoria` ( `idk` INT UNSIGNED NOT NULL, `nazwa` VARCHAR(20) NOT NULL, PRIMARY KEY(`idk`) ) ENGINE = MYISAM; -- Tabela wiążąca artykuły z kategoriami CREATE TABLE `ak` ( `ida` INT UNSIGNED NOT NULL, `idk` INT UNSIGNED NOT NULL, PRIMARY KEY (`ida`,`idk`) ) ENGINE = MYISAM ;
Powiedzmy, że bazę mamy wypełnioną przykładowymi danymi:
INSERT INTO artykul VALUES(4,'2011-10-23 10:10:10','Barszcz Czerwony'); INSERT INTO artykul VALUES(3,'2011-10-22 10:10:10','Witaminy'); INSERT INTO artykul VALUES(2,'2011-10-21 10:10:10','Rosol'); INSERT INTO artykul VALUES(1,'2011-10-20 10:10:10','Mucha na dziko'); INSERT INTO kategoria VALUES(1,'Przepisy na zupy'); INSERT INTO kategoria VALUES(2,'Zdrowie'); INSERT INTO kategoria VALUES(3,'Gotowanie'); INSERT INTO kategoria VALUES(4,'Zabawne'); INSERT INTO ak VALUES(1,1); INSERT INTO ak VALUES(1,2); INSERT INTO ak VALUES(1,3); INSERT INTO ak VALUES(2,2); INSERT INTO ak VALUES(3,1); INSERT INTO ak VALUES(3,2); INSERT INTO ak VALUES(3,3); INSERT INTO ak VALUES(4,2); INSERT INTO ak VALUES(4,4);
Jak widać każdy artykuł może należeć do wielu kategorii. Załóżmy, że mam 1000 artykułów w bazie i 100 kategorii. Chciałbym odczytać z bazy danych 10 (a jeśli ktoś będzie chciał następne to 10 kolejnych itd.) ostatnio dodanych artykułów należących do kategorii `zdrowie`(2), lub `Gotowanie`(3) ale tak, by przy każdym artykule wyświetlała się także lista wszystkich kategorii do których on należy. Czyli w php chciałbym mieć tabele zawierającą między innymi wiersz:
array ('tytul'=>'Barsz Czerwony','data'=>'2011-10-20 10:10:10','kategoria'=>array('Przepisy na zupy','Zdrowie','Gotowanie'))
Nie ma problemu by wyświetlić 10 ostatnich artykułów należących do kategorii 2 i 3. Np. mogę to zrobić tak.
SELECT artykul.ida, artykul.tytul, artykul.DATA , kategoria.nazwa FROM artykul, ak LEFT JOIN kategoria ON ak.idk=kategoria.idk WHERE (ak.idk=2 OR ak.idk=3) AND ak.ida=artykul.ida GROUP BY ak.ida ORDER BY artykul.DATA DESC LIMIT 10;
Mógłbym teraz osobnym zapytaniem odczytać tabelę `ak` i używając klauzuli WHERE otrzymam tylko wiersze dotyczące pobranych artykułów:
SELECT ak.ida, kategoria.nazwa FROM kategoria, ak WHERE ak.idk=kategoria.idk AND ak.ida IN (I tutaj ida interesujących mnie artykułów)
Brakuje mi wiedzy i doświadczenia by wymyślić lepsze rozwiązanie (czyli jedno zapytanie do zwrócenia newsów i drugie do pobrania ich kategorii). Czy ktoś ma lepszy pomysł na rozwiązanie (nie wiem może funkcje w mysqlu, podzapytania czy coś?), czy nie kombinować i zostać z takim? I nie wiem jak to z prędkością działania takich zapytań będzie. Są jakieś sprawdzone metody optymalizacji?
Jesli nie masz pomysłu na lepsze rozwiązanie to proszę napisz to... będę wiedział, żeby dłużej nie kombinować i zostawię jak jest.
pozdrawiam