Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Łączenie jeden-do-jeden
SDK
post 26.03.2009, 11:47:58
Post #1





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 6.04.2008

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


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


--------------------
Aplikacje mobilne iPhone i iPad: http://generio.pl / http://facebook.com/GenerioPL
Portfolio: http://poslinski.net
Go to the top of the page
+Quote Post
nospor
post 26.03.2009, 11:49:19
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




  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?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
SDK
post 26.03.2009, 11:55:28
Post #3





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 6.04.2008

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


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 )


--------------------
Aplikacje mobilne iPhone i iPad: http://generio.pl / http://facebook.com/GenerioPL
Portfolio: http://poslinski.net
Go to the top of the page
+Quote Post
nospor
post 26.03.2009, 11:56:52
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
SDK
post 26.03.2009, 12:12:36
Post #5





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 6.04.2008

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


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.


--------------------
Aplikacje mobilne iPhone i iPad: http://generio.pl / http://facebook.com/GenerioPL
Portfolio: http://poslinski.net
Go to the top of the page
+Quote Post
nospor
post 26.03.2009, 12:14:22
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
SDK
post 26.03.2009, 12:42:25
Post #7





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 6.04.2008

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


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?

Ten post edytował SDK 26.03.2009, 12:44:21


--------------------
Aplikacje mobilne iPhone i iPad: http://generio.pl / http://facebook.com/GenerioPL
Portfolio: http://poslinski.net
Go to the top of the page
+Quote Post
nospor
post 26.03.2009, 12:48:43
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
SDK
post 26.03.2009, 15:02:14
Post #9





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 6.04.2008

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


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


--------------------
Aplikacje mobilne iPhone i iPad: http://generio.pl / http://facebook.com/GenerioPL
Portfolio: http://poslinski.net
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: 12.06.2025 - 14:59