Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Full Outer Join w MySQL 5.7, w prostych słowach?
bugas
post 21.02.2017, 08:13:27
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 7.04.2009

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


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.
Go to the top of the page
+Quote Post
Pyton_000
post 21.02.2017, 08:43:13
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Złączyć do czego?
Go to the top of the page
+Quote Post
bugas
post 21.02.2017, 09:55:00
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 7.04.2009

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


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
Go to the top of the page
+Quote Post
nospor
post 21.02.2017, 10:01:08
Post #4





Grupa: Moderatorzy
Postów: 36 432
Pomógł: 6289
Dołączył: 27.12.2004




Alc, ta struktura bazy wyglada jakby byla mocno niedopracowana wink.gif


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

"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
bugas
post 21.02.2017, 10:11:20
Post #5





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 7.04.2009

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


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
Go to the top of the page
+Quote Post
Pilsener
post 21.02.2017, 10:26:12
Post #6





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


MYSQL nie wspiera full outer join. Moźna to jednak obejść za pomocą "UNION":

select ... left join ... UNION ALL select .. right join ...
Go to the top of the page
+Quote Post
bugas
post 21.02.2017, 10:43:32
Post #7





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 7.04.2009

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


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

Ten post edytował bugas 21.02.2017, 11:51:30
Go to the top of the page
+Quote Post
mmmmmmm
post 21.02.2017, 17:59:05
Post #8





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


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ć.
Go to the top of the page
+Quote Post
Pyton_000
post 21.02.2017, 18:19:32
Post #9





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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.
Go to the top of the page
+Quote Post
bugas
post 22.02.2017, 08:59:11
Post #10





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 7.04.2009

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


@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
Go to the top of the page
+Quote Post
Pyton_000
post 22.02.2017, 10:39:56
Post #11





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


@bugas twój dom twoje kredki... Tylko nie płacz potem że masz kolejne problemy.
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: 19.03.2024 - 11:57