Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Łączenie jeden-do-jeden
Forum PHP.pl > Forum > Bazy danych > MySQL
SDK
Witam

Muszę wyciągnąć powiązane ze sobą dane z 3 tabeli: tematy, posty, użytkownicy. Zależy mi, aby każdy temat był zwracany tylko raz ... obecnie, zwracany jest tyle razy, ile postów w nim występuję. Testowałem różne złączenia, ale dokumentacja mówi, że JOIN dołącza jeden-do-wielu. Próbowałem również DISTINCT, ale zapytanie sie wysypywało gdy wskazywał na id tematu.

Moje zapytanie:
  1. SELECT t.id id,
  2. title,
  3. c.date date,
  4. c.user user,
  5. u.login login FROM topics t
  6. JOIN posts c ON t.id = c.typeid
  7. JOIN users u ON c.user = u.id
  8. WHERE section = '$id'


Z góry dziękuję za każdą pomoc prowadzącą do rozwiązania problemu.

Pozdrawiam
nospor
  1. SELECT t.id id,
  2. title,
  3. c.date date,
  4. c.user user,
  5. u.login login FROM topics t
  6. JOIN posts c ON t.id = c.typeid
  7. JOIN users u ON c.user = u.id
  8. WHERE section = '$id'
  9. GROUP BY t.id


ps: poco dołączasz posty skoro nie chcesz ich wszystkich?
SDK
W postach jest informacja o użytkowniku, w dodatku zależy mi tylko na ostatnim poście dla danego tematu i użytkowniku który go napisał + dacie ( która również jest w tablicy z postami, dlatego sortowanie wg. daty )
nospor
Cytat
dlatego sortowanie wg. daty
jakos nie widze tego sortowania.

Powinienes sobie ulatwic zadanie i np. w tabeli post dodac kolumne MAIN ktora bedzie ci mowila czy to pierwszy post w temacie czy nie. Wowczas bedziesz robil selecty bez zbednego kombinowania.
SDK
Brakuje ORDER BY date na końcu.

Zapytanie wykonuje wszystko co trzeba, ale id się powtarza, to jedyna rzecz jaką trzeba wyeliminować.

Ten pomysł z MAIN'em sporo kłopotów by sprawił, ponieważ, trzeba by wszystkie posty z danego tematu przy dodawania i usuwaniu ustawiać. Myślę że prostszym rozwiązaniem było by zastosowanie widoku, który by zwracał ostatnie posty z każdego tematu ( co przy joinie owocowało by dokładnie takim złączeniem o jakie mi chodzi), ale być może istnieje jakieś rozwiązanie, które nie wymaga zastosowania takiej metody.
nospor
Cytat
trzeba by wszystkie posty z danego tematu przy dodawania i usuwaniu ustawiać
ze jak?
Przy tworzeniu tematu ustawiasz tylko pierwszy post na MAIN =1 . inne posty bedą mialy domyslnie MAIN=0.
Nie widze tu zadnego problemu.

pozatym jakbys usyl trigerow to wogole bajka
SDK
Chodzi o wyciągnięcie najnowszego w danym momencie postu z danego tematu (nie pierwszego).

Zdaje sobie sprawę z rozwiązania korzystającego z procedur składowanych lub widoków, jednak temat dotyczy stworzenia odpowiedniego zapytania.

Wykorzystywane ono będzie na stronie na której będą wyświetlane tematy (docelowo również na stronie gdzie wyświetlane są sekcje forum, zatem dojdzie jeszcze jedna tabela) ...

Jakiś pomysły jak wykonać to przez zapytanie?
nospor
no to jak to ma byc ostatni to dodajesz w temacie kolmne LAST_POST i po ptokach. uwierz na slowo - ulatwi ci to zycie. smile.gif

no ale ok:
  1. SELECT t.id id,
  2. title,
  3. c.date date,
  4. c.user user,
  5. u.login login FROM topics t
  6. JOIN posts c ON c.id IN (SELECT typeid FROM posts WHERE typeid=t.id ORDER BY date DESC LIMIT 1 )
  7. JOIN users u ON c.user = u.id
  8. WHERE section = '$id'

mniej wiecej cos takiego
dodalem pole date

ps: nazewnictwo pol i aliasow masz po prostu "cudne" winksmiley.jpg
SDK
Niestety to rozwiązanie nie jest skuteczne, w dodatku przy LIMIT 1 wyskakuje pod 5.1.29rc i 5.0.45 komunikat:

Cytat
#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'


To zapytanie zwraca jeden, zamiast 2 wierszy ( 2 tematy są w tej sekcji ), w dodatku niezależnie od order DESC czy ASC, zwraca pierwszy post zamiast najnowszego.

posts == comments ( stąd te dziwne aliasy smile.gif )
  1. SELECT t.id id,
  2. title,
  3. c.date date,
  4. user,
  5. login FROM topics t
  6. JOIN comments c ON c.id IN (SELECT typeid FROM comments WHERE typeid = t.id AND type = 'forum' ORDER BY date)
  7. JOIN users u ON u.id = c.user
  8. WHERE section = '5' ORDER BY date DESC
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.