Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Najnowsze zdjęcia w każdym albumie
sebekzosw
post 30.04.2011, 23:22:27
Post #1





Grupa: Zarejestrowani
Postów: 437
Pomógł: 42
Dołączył: 16.04.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
pmir13
post 1.05.2011, 09:03:38
Post #2





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

Ostrzeżenie: (0%)
-----


  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 );

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 15.08.2025 - 03:30