Witam.
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:

  1. CREATE TABLE `artykul` (
  2. `ida` INT UNSIGNED NOT NULL ,
  3. `data` DATETIME NOT NULL DEFAULT '2000-01-01 00:00:01',
  4. `tytul` VARCHAR(20) NOT NULL,
  5. PRIMARY KEY (`ida`)
  6. ) ENGINE = MYISAM ;
  7.  
  8. CREATE TABLE `kategoria` (
  9. `idk` INT UNSIGNED NOT NULL,
  10. `nazwa` VARCHAR(20) NOT NULL,
  11. PRIMARY KEY(`idk`)
  12. ) ENGINE = MYISAM;
  13.  
  14. -- Tabela wiążąca artykuły z kategoriami
  15. CREATE TABLE `ak` (
  16. `ida` INT UNSIGNED NOT NULL,
  17. `idk` INT UNSIGNED NOT NULL,
  18. PRIMARY KEY (`ida`,`idk`)
  19. ) ENGINE = MYISAM ;


Powiedzmy, że bazę mamy wypełnioną przykładowymi danymi:
  1. INSERT INTO artykul VALUES(4,'2011-10-23 10:10:10','Barszcz Czerwony');
  2. INSERT INTO artykul VALUES(3,'2011-10-22 10:10:10','Witaminy');
  3. INSERT INTO artykul VALUES(2,'2011-10-21 10:10:10','Rosol');
  4. INSERT INTO artykul VALUES(1,'2011-10-20 10:10:10','Mucha na dziko');
  5.  
  6. INSERT INTO kategoria VALUES(1,'Przepisy na zupy');
  7. INSERT INTO kategoria VALUES(2,'Zdrowie');
  8. INSERT INTO kategoria VALUES(3,'Gotowanie');
  9. INSERT INTO kategoria VALUES(4,'Zabawne');
  10.  
  11. INSERT INTO ak VALUES(1,1);
  12. INSERT INTO ak VALUES(1,2);
  13. INSERT INTO ak VALUES(1,3);
  14. INSERT INTO ak VALUES(2,2);
  15. INSERT INTO ak VALUES(3,1);
  16. INSERT INTO ak VALUES(3,2);
  17. INSERT INTO ak VALUES(3,3);
  18. INSERT INTO ak VALUES(4,2);
  19. 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.
  1. 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:
  1. 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