Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie z MAX + łączenie 2 tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
lukasamd
Witam,
mam na forum (phorum) tabelę z wiadomościami z której pobieram

- message_id
- datestamp
- forum_id
- subject
- thread
- user_id
- author
- thread_count

Chyba zawartości nie muszę tłumaczyć, po nazwach da się rozpoznać smile.gif Aby pobrać najnowsze posty daję zapytanie:

  1. 'SELECT MAX(message_id) as message_id, forum_id, subject, thread, MAX(user_id) as user_id, author, thread_count, MAX(datestamp) as datestamp
  2. FROM phorum_messages GROUP BY thread
  3. ORDER BY message_id DESC'


Tak skonstruowane pobiera mi najwyższe massage_id, user_id oraz datestamp z danego wątku. Wszystko wydaje się być ok... ale jednak nie jest :/ Author jest zawsze wybierany ten sam - autor tematu zamiast autora ostatniego postu. Próbowałem "podpiąć się" pod drugą tabelę z użytkownikami z której pobierałbym wartość "username":

  1. 'SELECT MAX(message_id) as message_id, forum_id, subject, thread, MAX(phorum_messages.user_id) as user_id, username, thread_count, MAX(datestamp) as datestamp
  2. FROM phorum_messages, phorum_users
  3. GROUP BY thread
  4. ORDER BY message_id DESC'


Działa "prawie" jak należy - w pierwszym wypadku wybrało odpowiedniego usera, niestety w każdym następnym się on powtarza (choć wcale nie jest autorem ostatniego posta w innych topicach).

Może ktoś pomóc? Już mnie po prostu trafia - jakby nie mogli w tym skrypcie dać tabeli topics jak w każdym innym cywilizowanym... sciana.gif
osiris
Kolejny raz ten sam problem. Podane przez Ciebie zapytania nie sa zgodne ze standardem SQL i dlatego zwracaja wyniki inne od oczekiwanych. MySQL udostepnia feature, ktory pozwala na grupowanie tylko po niektorych kolumnach podanych w klauzuli SELECT - co w przypadku nieznajomosci zastosowania tego feature'a czesto jest przyczyna otrzymywania blednych, a raczej innych od oczekiwanych wynikow tych zapytan.
Wiecej info tutaj:
http://dev.mysql.com/doc/refman/5.0/en/gro...den-fields.html

Pozdrawiam
lukasamd
Wszystkie tutoriale do GROUP BY jakie widziałem dawały przykłady na poleceniach typu SELECT SUM czy właśnie SELECT COUNT a nie wyciąganie takich danych jak ja chcę i/lub z łączeniem tabel. A dobra, wywalę pokazywanie autora postu - gdyby phorum miało sensowniej zrobioną bazę to i bez grupowania by się wyciągało takie informacje (tak jak to można zrobić w phpbb2/3, mybb, smf itp.).

Mimo wszystko dzięki za pomoc.
osiris
Rozwiazanie z uzyciem zapytania skolerowanego:
  1. SELECT *
  2. FROM phorum_messages p1
  3. WHERE p1.datestamp = (SELECT MAX(p2.datestamp) FROM phorum_messages p2 WHERE p2.thread = p1.thread)
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.