Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Łączenie kolumn niezależnych tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
janiek_j
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?
wookieb
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ń)
janiek_j
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...
wookieb
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.
janiek_j
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
wookieb
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.
janiek_j
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
wookieb
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`
janiek_j
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
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.