Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SQL][PHP] Sortowanie tematów wg. postów
PiotrekM
post 15.02.2010, 15:13:16
Post #1





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


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


Ten post edytował PiotrekM 15.02.2010, 15:14:15
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Robert1985
post 15.02.2010, 15:25:47
Post #2





Grupa: Zarejestrowani
Postów: 84
Pomógł: 7
Dołączył: 5.08.2009
Skąd: Tychy

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


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.


--------------------
"Istnieją dwa sposoby projektowania oprogramowania. Można napisać je tak prosto, że w oczywisty sposób nie będzie w nim niedoskonałości; można też uczynić je tak skomplikowanym ,że nie będzie w nim żadnych oczywistych niedociągnięć.Pierwsza metoda jest znacznie trudniejsza." C.A.R Hoare
Go to the top of the page
+Quote Post
PiotrekM
post 15.02.2010, 15:31:40
Post #3





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


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', '');
Go to the top of the page
+Quote Post
thek
post 15.02.2010, 16:05:27
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
PiotrekM
post 15.02.2010, 16:10:08
Post #5





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


dzięki, działa smile.gif

Ten post edytował PiotrekM 15.02.2010, 16:15:51
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: 18.07.2025 - 02:04