Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Struktura bazy danych forum.
Forum PHP.pl > Forum > Bazy danych > MySQL
marshallb
Chciałem zrobić forum opierające się na prostych tabelach.

Tematy
id, tytul, autor_id

Posty
id, temat, data, autor_id, tresc

Userzy
id, imie

Wszystko z początku jest tak idealnie proste ale... gdybym chciał zrobić teraz bardzo podstawową rzecz jaką jest wyświetlanie posortowanych tematów w których ktoś się ostatnio wypowiadał musiałbym w zapytaniu:
1. Znaleźć najnowsze posty z niepowtarzającymi się 'temat'.
2. Przyłączyć 'imie' autora.
3. Przyłączyć 'tytul' i 'autor_id' tematu
4. Przyłączyć 'imie' autora tematu.

Wyszłoby z tego dużo JOINów. Tylko stwierdzając po ostatnich poszukiwaniach jest to w ogóle niemożliwe ponieważ odnajdując najnowsze posty poprzez MAX(data) i GROUP BY 'temat' nie otrzymuje się wcale rekordu zawierającego tę skrajną wartość. Manual MySQL podaje takie głupie rozwiązanie - nie dostaje rekordu tylko rekord zawierający skrajną wartość, a takich może być wiele.

Innym sposobem na sortowanie takiej listy mogłoby być wyszukanie tematów i posortowanie ich wg dat postów, ale wtedy też trzeba GROUP BY 'temat'...

Pewnie zrobienie takiego jednego skomplikowanego zapytania jest mniej wydajne (o ile możliwe bo mi się nie udało) niż umieszczenie w tabeli Tematy nowej kolumny 'ostatni_post_id' i 'ostatni_post_data' i zmienianie jej za każdym razem kiedy dodaje się lub usuwa ostatniego posta.
Czy ktoś próbował?

Jak budujecie fora?
tomaszdurka
Ostatni post z dołączonym tytułem tematu i imieniem użytkownika który napisał ten post wygląda tak:

  1. SELECT p.*, u.imie, t.tytul
  2. FROM posty p, userzy u, tematy t
  3. WHERE p.autor_id = u.id AND p.temat = t.id
  4. ORDER BY p.DATA DESC LIMIT 0, 1


Rozumiem że posty.temat to raczej temat_id.

Pozdrawiam.
marshallb
Problem to jak z takich tabel uzyskać tematy posortowane wg dat ostatnich postów.
Połączyć je z resztą informacji jest łatwo.
tomaszdurka
Tutaj jest zapytanie na 10 ostatnio zaktualizowanych tematów.

  1. SELECT t.id, t.tytul, u.imie, max(c.DATA)
  2. FROM posty p, userzy u, tematy t
  3. WHERE t.autor_id = u.id AND p.temat = t.id
  4. GROUP BY t.id, t.tytul
  5. ORDER BY p.DATA DESC LIMIT 0, 10


Pozdrawiam.
marshallb
Nie chce być namolny ale... tongue.gif w ten sposób nie uzyskam id i autor_id ostatnich postów.
MAX(p.data) zwraca tylko tę jedną wartość bez reszty rekordu. To właśnie ten problem z manula MySQL z nic nie rozwiązującym rozwiązaniem przez subquery.

Mi chodzi o to żeby po jednym zapytaniu, przy tak zbudowanych tabelach uzyskać następujące dane:
- id tematu
- tytuł tematu
- id autora tematu
- nicka autora tematu
- date ostatniego posta
- id autora ostatniego posta
- nicka autora ostatniego posta

Wszystko ORDER BY ostatni post DESC.

Aha, i jeszcze do tego wszystkiego ilość postów w każdym temacie.

I udało mi się to zrobić bardzo zawiłymi JOINami ale albo tematy się powtarzały albo przy innym sposobie info o ostatnich postach było o pierwszych postach w temacie.
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.