![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 119 Pomógł: 0 Dołączył: 15.07.2003 Skąd: Grajewo Ostrzeżenie: (0%) ![]() ![]() |
Witam!
Skonstruowałem zapytanie wyświetlające wszystkie tematy danego forum (id, temat, id autora, nazwę autora, liczbę postów, datę osatniej modyfikacji):
Chciałbym do tego dodać dane ostatniego postu [p.id] (tego z MAX(p.time)) i dane jego autora [p.user_id][u.name], ale pogubiłem się. Wydaje mi się, że z WHERE odpadnie u.id = p.user_id, ale co dalej? Da się wydobyć te dane razem z tym zapytaniem? Jeśli tak, to będę wdzięczny za wskazówki. Ten post edytował onlyX 3.10.2009, 15:32:07 |
|
|
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
A czemu zamiast szukania po dacie ie wyciągasz posta z najwyższym id w danym forum/podforum? Zapewne masz w tabeli postów autoincrement na id. Zauważ, że najwyższe id w danym temacie/podforum/forum to zawsze najnowszy post i z automatycznie najświeższą datą. Tymczasem operacje na datach potrafią w niektórych cms lub forach powodować błędy. Sam swego czasu musiałem przerabiać skrypty php-fusion właśnie pod tym kątem z jakim Ty masz problem, czyli wyświetlanie danych użytkownika, którego post jest najświeższy. Domyślnie bowiem przechowywana jest tylko data ostatniego posta, a nie jego id, co jest głupotą. W sytuacji bowiem, gdy zapis do tabeli forum jest o ułamek sekundy późniejszy niż do tabeli postów nie można zidentyfikować jaki post jest ostatni i kto go napisał, bo nie istnieje post z tym samym timestamp (różne w obu tabelach). Tu najlepsze jest przechowywanie id posta oraz po nim wyszukiwanie i nie używanie timestamp do tego zadania.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 119 Pomógł: 0 Dołączył: 15.07.2003 Skąd: Grajewo Ostrzeżenie: (0%) ![]() ![]() |
Masz rację, zminiłem ORDER na najwyższe id, i wyciągnąłem w SELECT id naświeższego postu. Jednak dalej mam problem z wyciągnięciem danych autora tego postu. Nie wiem czy to wykonalne przy mojej strukturze tabel.
(IMG:http://img59.imageshack.us/img59/6070/bazab.jpg) Ten post edytował onlyX 9.10.2009, 11:29:24 |
|
|
![]()
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 ![]() |
Zrób LEFT JOIN pomiędzy tabelą posts a users używając posts.user_id = users.id bo skoro masz informacje o najświeższym poście to masz i informację użytkowniku, jego id i łatwo to połączyć z tabelą users, skąd owe informacje wyciągniesz.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 119 Pomógł: 0 Dołączył: 15.07.2003 Skąd: Grajewo Ostrzeżenie: (0%) ![]() ![]() |
W dalszym ciągu nie wiem jak to zrobić.
Pogubiłem się w całym tym zapytaniu. Zrobiłem LEFT JOIN, ale dalej nie wiem co dopisać do SELECT, aby otrzymać dane autora ostatniego postu. Z autorem pierwszego postu nie ma problemu. Może mi ktoś to wytłumaczyć, albo dać namiar na wytłumaczenie z bardziej skomplikowanymi przykładami, bo GROUP BY i JOIN w jednym zapytaniu to już dla mnie za dużo (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat Da się wydobyć te dane razem z tym zapytaniem? Jeśli tak, to będę wdzięczny za wskazówki. Zrób pole, w którym będziesz miał ustawiane ID najnowszego posta dla rekordu z tematem. Można - oczywiście - wymusić zachowanie normalizacji przez wykorzystanie z podzapytania, ale będzie to zabójcze dla bazy. Najlepiej osobne pole na ID najnowszego tematu i zwykłym joinem sobie dociągasz. (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#7
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Erix sugeruje Ci dobre rozwiązanie problemu. Dla tabeli forum lub temat przechowuj id ostatniego posta. Oszczędzi to bazie wiele łączenia i zajeżdżania jej. Tak wiele skryptów for internetowych rozwiązuje ten problem. Jedynie fusion, jak na złość trzymie tam timestamp zamiast id (o czym zresztą we wcześniejszym poście wspomniałem). Dzięki polu z najnowszym id dla danego forum, zmniejszasz ilość łączeń LEFT JOIN do uzyskania oczekiwanego przez Ciebie rezultatu. Używanie GROUP BY, JOIN i każdego innego słowa kluczowego SQL z czasem staje się naturalne i po kilku, kilkunastu wykorzystaniach nawet zawiłe konstrukcje będziesz sam pisał i się dziwił jak można tego nie rozumieć. Praktyka czyni cuda (IMG:style_emoticons/default/winksmiley.jpg)
Ten post edytował thek 10.10.2009, 20:38:56 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 16.09.2025 - 02:13 |