Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Full Outer Join w MySQL 5.7
Forum PHP.pl > Forum > Bazy danych > MySQL
bugas
Witam,
mam pytanie, czy ktoś mógłby w miarę prosty sposób podać zapytanie dla MySQL 5.7 - połączenie tabel m01, m02, ... m12 (czyli miesiące) po kolumnie "nazwa" (tytuł kolumny jednakowy we wszystkich tabelach).
Po dogłębnej lekturze wiem, że chciałbym aby było to łączenie FULL OUTER JOIN (czyli wszystko, bez względu na to czy wartość występuje po lewej, czy po prawej).
Niestety nie udało mi znaleźć "prostej" formuły, manual wspomina o tym, ale w taki sposób, że nie jestem w stanie tego zdekodować.

Z góry dziękuję za pomoc.
Pyton_000
Złączyć do czego?
bugas
Wyświetlić smile.gif obecnie korzystam z takiego zapytania, które jest niemal ok, tylko właśnie ogranicza wyniki do wartości z m01. A w m02 i kolejnych miesiącach pojawiały się nowe wartości, które również chciałbym żeby były wyświetlone.

  1. SELECT
  2. *
  3. FROM
  4. m01
  5. LEFT JOIN
  6. m02
  7. ON
  8. m01.nazwa = m02.nazwa
  9. LEFT JOIN
  10. m03
  11. ON
  12. m03.nazwa = m02.nazwa
  13. LEFT JOIN
  14. m04
  15. ON
  16. m04.nazwa = m03.nazwa
  17. LEFT JOIN
  18. m05
  19. ON
  20. m05.nazwa = m04.nazwa
  21. LEFT JOIN
  22. m06
  23. ON
  24. m06.nazwa = m05.nazwa
  25.  
  26. LEFT JOIN
  27. m07
  28. ON
  29. m07.nazwa = m06.nazwa
  30.  
  31. LEFT JOIN
  32. m08
  33. ON
  34. m08.nazwa = m07.nazwa
  35.  
  36. LEFT JOIN
  37. m09
  38. ON
  39. m09.nazwa = m08.nazwa
  40. LEFT JOIN
  41. m10
  42. ON
  43. m10.nazwa = m09.nazwa
  44. LEFT JOIN
  45. m11
  46. ON
  47. m11.nazwa = m10.nazwa
  48. LEFT JOIN
  49. m12
  50. ON
  51. m12.nazwa = m11.nazwa
  52.  
  53. LIMIT 0, 500
nospor
Alc, ta struktura bazy wyglada jakby byla mocno niedopracowana wink.gif
bugas
Nazwijmy to bardzo tymczasowa baza, stworzona na potrzeby analizy prostych danych. Nie jest to element strony czy czegokolwiek "dynamicznego". Wrzucone, przemielone, trochę uporządkowane, przeanalizowane i drop wink.gif
Pilsener
MYSQL nie wspiera full outer join. Moźna to jednak obejść za pomocą "UNION":

select ... left join ... UNION ALL select .. right join ...
bugas
Ogromne dzięki, widziałem gdzieś ten sposób z UNION, ale nie skumałem... więc jeszcze tylko doprecyzuję: najpierw wszystkie (m01 ... m12) tabele z instrukcją LEFT JOIN ... ON i następnie UNION ALL i wszystkie tabele z instrukcją RIGHT JOIN ?

EDIT:
Należy użyć samo UNION, ponieważ UNION ALL powoduje duplikację wpisów. Samo UNION usuwa zduplikowane wpisy.
Jest jeszcze problem z wpisami, które pojawiły się np. w m03, ale nie ma ich już w m04
mmmmmmm
Samo UNION usuwa duplikaty wszędzie. Czyli jeśli w tabeli m12 pojawią ci się dwa takie same rekordy na wyjściu, to w wyniku dostaniesz tylko jeden. Można się nieźle zdziwić.
Pyton_000
Jak dla mnie to z du... są te tabele...

Weź jak człowiek wpakuj wszystko w 1 tabelę dodaj kolumnę `miesiac` i tam trzymaj nr. miesiąca.
bugas
@mmmmmmm

jako, że "nazwa" jest unikalna to nie powinny pojawić się dwa takie same rekordy w jednej tabeli, nawet wynikowej (chyba, że źle Cię zrozumiałem)



@Pyton_000
Można by, ale później trzeba by było zrobić strone php żeby to wyświetlać tak jak potrzebuje. Albo zrobić cały skrypt wpisujący/edytujący odpowiednio dane do bazy. Kupa roboty z przewagą kupy smile.gif
Pyton_000
@bugas twój dom twoje kredki... Tylko nie płacz potem że masz kolejne problemy.
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.