Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Łączenie kolumn niezależnych tabel
janiek_j
post
Post #1





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 31.07.2008

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


Witam, mam taki problem:
mam dwie tabele pierwsza np id name datetime_add
druga cos_id title cos_datetime_add

i teraz chce połączyć obydwie tabele aby wyglądały mniej więcej tak:
id name cos_id title datetime_add(połączona z cos_datetime_add)
chodzi o to ze pierwsza tabela zawiera komentarze a druga to posty obie są niezależne od siebie, chce je połączyć po to aby móc zrobić order na dacie i wyciągnąć np 20 ostatnich zdarzeń z tych 2 tabel ale nei wiem jak, kombinowałem z join'ami ale mi nie wychodziło, jakieś wskazówki?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




No to skoro Ci nie wychodziło to pokaż CO było źle. Manuala JOIN-a nie będziemy czytać każdemu (który pojawia się z częstotliwością 1 na dzień)


--------------------
Go to the top of the page
+Quote Post
janiek_j
post
Post #3





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 31.07.2008

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


jak łącze joinem to mi po "join" zwraca iloczyn kartezjański
ja chce dostać w jednej tabeli posty i komentarze z połączonymi kolumnami z datami dodania ich ...
przykładowe zapytania których używałem :
SELECT * FROM `forum_posts` join `comments` - zwraca mi iloczyn kartezjanski
SELECT * FROM `forum_posts` join `comments` on `forum_posts`.post_datetime_add = `comments`.datetime_add - zwraca pusty wynik - logiczne bo daty z obu tabel są różne... left join zwróci tylko posty z pustymi kolumnami z comments .. nie wiem jak to ugryźć, za dobry z mysqla nie jestem ale wiem gdzie jest manual mysql i definicje podstawową joina raczej znam...
Go to the top of the page
+Quote Post
wookieb
post
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




JOINY najczęściej robi Się po identyfikatorach a nie po datach. Komentarze przypisany są do posta, który ma pewne ID po którym powinieneś łączyć tabele.


--------------------
Go to the top of the page
+Quote Post
janiek_j
post
Post #5





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 31.07.2008

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


no właśnie chodzi o to że komentarze to całkiem oddzielna działka w portalu, nie mająca nic wspólnego z postami... chce połączyć te 2 tabele aby móc zrobić tak jakby podgląd zdarzeń w portalu wg daty... Oczywiście rozwiązaniem jest stworzenie tabeli ze zdarzeniami i przy dodaniu komentarza lub posta lub czegokolwiek innego dodawać wpis do niej, ale to wymaga dopisanie kolejnych funkcji czego chciałem uniknąć... chyba że uda mi się jakoś z triggerami.. no nic, dzięki za pomoc...smile.gif
Go to the top of the page
+Quote Post
wookieb
post
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Join nie służy do łączenia wyników zapytania ale powiązania jednej tabeli z drugą, także źle podchodzisz do tematu.
  1. MógłBYś wykorzystać UNION ale wtedy liczba zwróconych kolumn musi się zgadzać.
  2. Najłatwiej będzie TO zrobić w ten sposób
  3. [sql]
  4. (SELECT id, 'post' AS typ FROM forum_posts)
  5. UNION
  6. (SELECT id, 'comment' AS typ FROM comments)
  7. ORDER BY IF(post_datetime_add IS NOT NULL, post_datetime_add, datetime_add) DESC

Dostaniesz listę id elementów, które potem musisz pobrać oddzielnym zapytaniem.
Oczywiście staraj się ograniczyć wyniki w podzapytaniach.


--------------------
Go to the top of the page
+Quote Post
janiek_j
post
Post #7





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 31.07.2008

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


Dzięki:) z tym już dalej powalczę, o taki efekt mi właśnie chodziło:)

dodałem do tabel po jednej pustej kolumnie ( col_null ) i przy łączeniu jak chce dane z pierwszej to w drugiej ustawiam col_null - efekt osiągnięty
  1. (
  2. SELECT `comments`.null_col AS post_id, `comments`.null_col AS poster_user_login, `comments`.comment_id AS comment_id, `comments`.user_login AS comment_user_login, `comments`.datetime_add
  3. FROM `comments`
  4. )
  5. UNION (
  6.  
  7. SELECT `forum_posts`.post_id, `forum_posts`.poster_user_login, `forum_posts`.null_col, `forum_posts`.null_col, `forum_posts`.post_datetime_add
  8. FROM `forum_posts`
  9. )
  10. ORDER BY `datetime_add` ASC


Ten post edytował janiek_j 14.11.2010, 22:43:39
Go to the top of the page
+Quote Post
wookieb
post
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Dodałeś kolumne null_col? Po co?
  1. SELECT `forum_posts`.post_id, `forum_posts`.poster_user_login, NULL AS col1, NULL AS col2, `forum_posts`.post_datetime_add AS datetime_add
  2. FROM `forum_posts`


Ten post edytował wookieb 15.11.2010, 07:12:32


--------------------
Go to the top of the page
+Quote Post
janiek_j
post
Post #9





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 31.07.2008

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


Bo nie wiedziałem, że można tak jak napisałeś..smile.gif Dzięki:)

mam jeszcze pytanie co do wydajności takich konstrukcji, powiedzmy ze zrobię union z 4 selectów z tego zrobie sobie widok i pozniej ten widok będę join'ował do kolejnych 4 tabel i dopiero pobierał wynik 30 ostatnich elementów z powiedzmy 10 tys elementów.....questionmark.gif

Ten post edytował janiek_j 15.11.2010, 15:09:02
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 Aktualny czas: 22.08.2025 - 03:33