Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Łączenie tabel, max i group by
Forum PHP.pl > Forum > Bazy danych > MySQL
wlamywacz
Witam

Posiadam tabele (params) w której składuje parametry stron.
  1. CREATE TABLE IF NOT EXISTS `params` (
  2. `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `pageid` int(10) UNSIGNED NOT NULL,
  4. `date` date NOT NULL,
  5. `value` bigint(20) NOT NULL,
  6. `type` int(10) UNSIGNED NOT NULL COMMENT '0-gsite,1-pr,2-ylinks,3-ylinksdomain',
  7. PRIMARY KEY (`id`),
  8. UNIQUE KEY `pageid` (`pageid`,`date`,`type`)
  9. ) ENGINE=InnoDB;

Każdej stronie może odpowiadać żaden lub jeden rekord. Tabela ze stronami:
  1. CREATE TABLE IF NOT EXISTS `pages` (
  2. `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `url` varchar(255) collate utf8_polish_ci NOT NULL,
  4. `update` datetime NOT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB ;

Cały problem polega na tym aby wyświetlić dane z tabeli pages i dołączyć wartość ostatniego (najmłodszego) rekordu z tabeli params i wyświetlić jego wartość sortując po pages.update oraz warunku złączenia
  1. pages.id = params.pageid AND params.type = 0

Próbowałem już sposobów z MAX() oraz GROPU BY jednak zawsze otrzymywałem totalne bzdury. W tabeli params będzie kilkaset k rekordów więc trzeba mieć na uwadze szybkość działania.

Z góry dziękuje za pomoc
mortus
Może coś takiego:
  1. SELECT pag.id, pag.url, pag.UPDATE, par.id, par.pageid, par.date, par.value, par.type FROM pages pag LEFT JOIN (SELECT * FROM params p1 WHERE p1.type = 0 AND date = (SELECT MAX(date) FROM params p2 WHERE p2.pageid = p1.pageid)) AS par ON par.pageid = pag.id;

Nie wiem, czy jest to optymalne rozwiązanie, ale dodatkowo zindeksował bym kolumnę date w tabeli params.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.