Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Najnowsze zdjęcia w każdym albumie
Forum PHP.pl > Forum > Bazy danych > MySQL
sebekzosw
Witam!
Mam taką tabelę
  1. CREATE TABLE `sk_cms_albums_list` (
  2. `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id kategorii',
  3. `url` varchar(100) collate utf8_polish_ci NOT NULL COMMENT 'unikalny adres',
  4. `title` mediumtext collate utf8_polish_ci NOT NULL COMMENT 'tytuł',
  5. `metaTitle` mediumtext collate utf8_polish_ci COMMENT 'meta title',
  6. `metaDescription` mediumtext collate utf8_polish_ci COMMENT 'meta description',
  7. `metaKeywords` mediumtext collate utf8_polish_ci COMMENT 'meta keywords',
  8. `gid` int(10) UNSIGNED NOT NULL DEFAULT '0',
  9. `order` int(11) NOT NULL DEFAULT '0' COMMENT 'kolejność',
  10. `parent` int(10) UNSIGNED NOT NULL DEFAULT '0',
  11. PRIMARY KEY (`id`),
  12. UNIQUE KEY `UNIQUE` (`url`),
  13. KEY `INDEX` (`parent`),
  14. KEY `gid` (`gid`)
  15. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci COMMENT='Albumy zdjęć na stronie' AUTO_INCREMENT=17 ;


w której mam listę albumów oraz

ORAZ

  1. CREATE TABLE `sk_cms_albums_photos` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `aid` int(11) NOT NULL DEFAULT '0',
  4. `url` varchar(100) collate utf8_polish_ci NOT NULL,
  5. `dir` mediumtext collate utf8_polish_ci COMMENT 'odnośnik pliku na serwerze',
  6. `file` varchar(100) collate utf8_polish_ci NOT NULL COMMENT 'plik na serwerze',
  7. `title` mediumtext collate utf8_polish_ci COMMENT 'tytuł zdjęcia',
  8. `description` mediumtext collate utf8_polish_ci COMMENT 'opis zdjęcia',
  9. `metaTitle` mediumtext collate utf8_polish_ci COMMENT 'meta tytuł',
  10. `metaKeywords` mediumtext collate utf8_polish_ci COMMENT 'meta słowa kluczowe',
  11. `metaDescription` mediumtext collate utf8_polish_ci COMMENT 'meta opis',
  12. `order` int(11) NOT NULL,
  13. `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  14. PRIMARY KEY (`id`),
  15. UNIQUE KEY `file` (`file`)
  16. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=184 ;


gdzie są zdjęcia albumów. Relacje są `sk_cms_albums_photos`.`aid` = `sk_cms_albums_list`.`id`

Każde zdjęcie w każdym albumie po dodaniu dostaje kolejność (order == 1), a inne są o jeden większe.

  1. SELECT `a`.`url`, `ap`.`title`, `ap`.`dir`, `ap`.`id` AS `pid` FROM `sk_cms_albums_photos` AS `ap`
  2. LEFT JOIN `sk_cms_albums_list` AS `a` ON `a`.`id` = `ap`.`aid`
  3. WHERE `ap`.`order` = 1 ORDER BY `ap`.`date` DESC LIMIT 3


za pomocą tego zapytania pobieram wszystkie albumy, w których kolejność == 1 i są najnowsze.

Chciałbym za pomocą jednego zapytania wyciągnąć najnowsze zdjęcie z każdego albumu. Wymyśliłem takie zapytanie:
  1. SELECT MAX(`p`.`date`) AS `d` , `p`.* FROM `sk_cms_albums_photos` AS `p` GROUP BY `p`.`aid` ORDER BY `d` DESC

ale nie działa - bardzo proszę o pomoc
pmir13
  1. SELECT p.* FROM
  2. ( SELECT aid,max(date) AS najnowsza_data
  3. FROM sk_cms_albums_photos
  4. GROUP BY aid ) p1
  5. JOIN sk_cms_albums_photos p
  6. ON p.id =
  7. ( SELECT pu.id
  8. FROM sk_cms_albums_photos pu
  9. WHERE pu.aid = p1.aid
  10. AND pu.date = p1.najnowsza_data
  11. LIMIT 1 );

Wyjaśnienie: w pierwszym podzapytaniu dostajemy listę dat najnowszego zdjęcia dla wszystkich albumów, bez konkretnej informacji które dokładnie zdjęcie zostało ostatnie dodane, bo tej informacji od razu dostać nie możemy. Najnowsza data oraz numer albumu idą jako ref do drugiego (zewnętrznego zapytania), które zwraca wszystkie kolumny tabeli zdjęć połączone przez pierwszy z brzegu id, który odpowiada dacie i id albumu z pierwszego. Najprawdopodobniej taki id będzie tylko jeden, o ile kilku zdjęć nie dodajemy przez wspólny formularz wykorzystując jeden INSERT, ale nie wiem jak robisz, więc tu jest przypadek ogólny.
Przy aktualnej definicji tabel warto dodać:
  1. ALTER TABLE sk_cms_albums_photos ADD INDEX( aid,date );

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-2024 Invision Power Services, Inc.