Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL][PHP] Sortowanie tematów wg. postów
Forum PHP.pl > Forum > Przedszkole
PiotrekM
Witam,
potrzebuje posortować tematy wg. postów czyli tak jak na każdym forum. Temat z najnowszą odpowiedzią ląduje na górze.
Uklepałem takie zapytanie, ale nie działa. Nie sortuje oraz zamiast id tematu zwraca id postu :/
  1. SELECT * FROM zt_topics LEFT JOIN zt_posts ON zt_posts.topic = zt_topics.id GROUP BY zt_topics.id ORDER BY zt_posts.id DESC
Robert1985
A może byś tak napisał jak wygląda tabele?? To twoje zapytanie wygląda dziwnie podaj jak wyglądają te dwie tabele to Ci pomożemy.
PiotrekM
kurde felek, całkowicie zapomniałem

zt_topics
  1. CREATE TABLE IF NOT EXISTS `zt_topics` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  4. `url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  5. `points` int(11) NOT NULL DEFAULT '0',
  6. `cat` int(11) NOT NULL,
  7. `autor` int(11) NOT NULL,
  8. `data` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  9. `agent` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  10. `guessed` int(11) NOT NULL DEFAULT '0',
  11. `stick` int(1) NOT NULL DEFAULT '0',
  12. `close` int(1) NOT NULL DEFAULT '0',
  13. `tags` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  14. `wheen` int(25) NOT NULL,
  15. PRIMARY KEY (`id`)
  16. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
  17.  
  18. --
  19. -- Zrzut danych tabeli `zt_topics`
  20. --
  21.  
  22. INSERT INTO `zt_topics` (`id`, `title`, `url`, `points`, `cat`, `autor`, `data`, `agent`, `guessed`, `stick`, `close`, `tags`, `wheen`) VALUES
  23. (1, 'Cancion del adios ', 'Cancion_del_adios', 5, 2, 1, '21.01.2010, 16:59', '', 0, 0, 0, '', 0),
  24. (2, 'La quolpe', 'La_quolpe', 0, 1, 1, '21.01.2010, 16:59', '', 0, 0, 0, '', 0);


zt_posts
  1.  
  2. --
  3. -- Struktura tabeli dla `zt_posts`
  4. --
  5.  
  6. CREATE TABLE IF NOT EXISTS `zt_posts` (
  7. `id` int(11) NOT NULL AUTO_INCREMENT,
  8. `topic` int(11) NOT NULL,
  9. `autor` int(11) NOT NULL,
  10. `good` int(1) NOT NULL DEFAULT '0',
  11. `content` text COLLATE utf8_unicode_ci NOT NULL,
  12. `data` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  13. `agent` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  14. PRIMARY KEY (`id`)
  15. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=14 ;
  16.  
  17. --
  18. -- Zrzut danych tabeli `zt_posts`
  19. --
  20.  
  21. INSERT INTO `zt_posts` (`id`, `topic`, `autor`, `good`, `content`, `data`, `agent`) VALUES
  22. (5, 2, 1, 0, 'dfsdfddf', '21.01.2010, 16:59', ''),
  23. (6, 1, 1, 0, 'vsdggsg\r\ndgd\r\n\r\ndgs\r\nsdg', '21.01.2010, 16:59', ''),
  24. (4, 1, 1, 0, 'dssf', '21.01.2010, 16:59', ''),
  25. (7, 1, 0, 0, 'fg\r\ng\r\ng\r\ngf', '21.01.2010, 16:59', ''),
  26. (8, 1, 1, 0, 'dsdggsd\r\ndg\r\n', '21.01.2010, 16:59', ''),
  27. (9, 2, 1, 0, '\r\ndg\r\ng\r\nds\r\nsgd', '21.01.2010, 16:59', ''),
  28. (10, 1, 1, 0, 'dgd\r\n\r\ndgs\r\ngd\r\ng', '21.01.2010, 16:59', ''),
  29. (11, 2, 1, 0, 'hhgdfh', '21.01.2010, 16:59', ''),
  30. (12, 1, 1, 0, 'dsffsd\r\nf\r\nfsd', '21.01.2010, 16:59', ''),
  31. (13, 1, 1, 0, 'ffgfggf', '21.01.2010, 16:59', '');
thek
Musisz tak pokombinować, aby przy łączeniu tych tabel post o najwyższym id zawsze był pierwszy w kolejności. GROUP BY działa bowiem na takiej zasadzie, że łączy do głównej tabeli pierwszy rekord z dodatkowej. Tak więc ważne, by ów rekord miał najwyższa datę (jako że masz autoincrement to jest on najwyższym id jednocześnie). Można więc to rozwiązać poprzez posortowanie tabeli postów według id już na etapie LEFT JOIN choćby.
Stąd Masz
  1. SELECT * FROM zt_topics LEFT JOIN (SELECT * FROM zt_posts ORDER BY id DESC) AS ordered_posts ON ordered_posts.topic = zt_topics.id GROUP BY zt_topics.id ORDER BY ordered_posts.id DESC
Takie coś nie jest jedynym rozwiązaniem jednak tego przypadku. Popatrz jak działa to "coś" i optymalizuj dalej winksmiley.jpg
PiotrekM
dzięki, działa smile.gif
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.