Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak zrealizować zapytanie wybierające po jednym - najnowszym artykule z kategorii
Forum PHP.pl > Forum > Bazy danych > MySQL
tjaden
Mam problem ( w sumie prosta sprawa ), mam w bazie danych 'artykuły' pola 'content', 'category', 'created_at'.
A pytanie brzmi jak można wybrać z bazy po jednym - najnowszym - artykule z każdej katergorii.
Wiem, że można tak:
SELECT content
FROM `artykuły`
WHERE created_at
IN ( SELECT MAX( created_at )
FROM `artykuły`
GROUP BY category )

, ale jest chyba jakis prostszy sposób?questionmark.gif
patryczakowy
A spróbuj tak
  1. SELECT content, MAX( created_at ) FROM `artykuły` GROUP BY category
tjaden
Cytat(patryczakowy @ 7.09.2009, 19:49:06 ) *
A spróbuj tak
[SQL] pobierz, plaintext
  1. SELECT content, MAX( created_at ) FROM `artykuły` GROUP BY category
[SQL] pobierz, plaintext


Już próbowałem w ten sposób. Zwraca mi daty publikacji najnowszych rekordów - czyli niby OK, ale treść jest treścią innych artykułów
patryczakowy
  1. SELECT content, MAX( created_at ) FROM `artykuły` GROUP BY category ORDER BY created_at DESC
tjaden
Cytat(patryczakowy @ 7.09.2009, 19:59:35 ) *
[SQL] pobierz, plaintext
  1. SELECT content, MAX( created_at ) FROM `artykuły` GROUP BY category ORDER BY created_at DESC
[SQL] pobierz, plaintext


Też nie działa
patryczakowy
Ale co nie działa żle wyświetla czy wo gule nie wyświetla ? Jakiego typu jest pole created_at ? Spróbuj zamienić odred z group by ? jeśli da rady. lub DESC na ASC
tjaden
Cytat(patryczakowy @ 7.09.2009, 20:09:16 ) *
Ale co nie działa żle wyświetla czy wo gule nie wyświetla ? Jakiego typu jest pole created_at ? Spróbuj zamienić odred z group by ? jeśli da rady. lub DESC na ASC


Tak jak radzisz zaraz poprubóję.
Tak wogóle samo zapytanie działa ale nie zwraca prawidłowych rekordów: mianowicie zwraca treść starszych artykułów

created_at jest typu 'datetime'
patryczakowy
nie wiem czy funkcja agregująca coś tu nie miesza sprubuj jeszcze tak
  1. SELECT * FROM `artykuły` GROUP BY category ORDER BY created_at DESC
tjaden
Dzięki za starania, ale dalej nic (tzn. działa tylko wyniki są złe ;])
AxZx
Cytat(tjaden @ 7.09.2009, 20:20:07 ) *
Dzięki za starania, ale dalej nic (tzn. działa tylko wyniki są złe ;])


przydałoby się podzapytanie. mysql nie zgrupuje wg kategorii zwracając ostatni art.
patryczakowy
Miałem kiedyś podobny problem , ale przeszukałem teraz pliki i właśnie widzę że też używałem podzapytania smile.gif , a byłem przekonany że rozwiązałem to prościej
tjaden
Cytat(patryczakowy @ 7.09.2009, 20:41:07 ) *
Miałem kiedyś podobny problem , ale przeszukałem teraz pliki i właśnie widzę że też używałem podzapytania smile.gif , a byłem przekonany że rozwiązałem to prościej


A możesz podać to rozwiązanie?
Z góry dzięki.
artega
Ten przykład powinien wszystko przedstawić
  1. DROP TABLE IF EXISTS `content`;
  2.  
  3. CREATE TABLE `content` (
  4. `id` mediumint(8) UNSIGNED NOT NULL AUTO_INCREMENT,
  5. `body` text NOT NULL,
  6. `created_at` int(10) UNSIGNED NOT NULL,
  7. `category` int(10) UNSIGNED NOT NULL,
  8. PRIMARY KEY (`id`)
  9. );
  10.  
  11. INSERT INTO `content` (`body`, `created_at`, `category`) VALUES ('foo', 1, 1), ('bar', 2, 1), ('foobar', 1, 2);
  12.  
  13. SELECT `t2`.* FROM (SELECT `category`, MAX(`created_at`) AS `created_at` FROM `content` GROUP BY `category`) AS `t1` JOIN `content` AS `t2` ON `t2`.`category` = `t1`.`category` AND `t2`.`created_at` = `t1`.`created_at`
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.