Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Łącznie dwóch tabel
lukpio3
post 14.01.2017, 16:49:15
Post #1





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 1.05.2010

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


Witajcie,
Mam problem z pewnym prostym zapytaniem. Mam dwie tabele z tym że druga powstała później więc ma mniejszy zakres danych. Potrzebuję teraz zrobić selecta aby wyświetlić zawartość tabeli pierwszej w taki sposób aby po połączeniu z tabelą 2 pominął określone rekordy czyli wyświetla całą tabelę 1 natomiast wiersze które dają się połączyć z tabelą 2 warunkowo pominął. I mam takie zapytanie:

  1. SELECT Z.ID_ZAP, Z.DATA_1, Z_DATA_2 .....
  2. FROM ZAPYTANIA Z
  3. LEFT JOIN STATUSY S ON Z.ID_ZAP = S.ID_ZAP
  4. AND S.STATUS != 'Zakończono'
  5. ORDER BY ID_ZAP DESC


Pominąłem tu wypisywanie wszystkich danych (DATA_1, DATA_2 ...). W wyniku tego zapytania oczekiwałem że rekordy gdzie STATUS ma wartość 'Zakończono' zostaną pominięte. Natomiast tak się nie dzieje. Wyświetla wszystko wraz z rekordami gdzie status ma wartość Zakończono.
Go to the top of the page
+Quote Post
mmmmmmm
post 14.01.2017, 19:31:58
Post #2





Grupa: Zarejestrowani
Postów: 1 411
Pomógł: 308
Dołączył: 18.04.2012

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


Rozumiem, że tu masz dwa problemy. Pierwszy z tymi tabelami. Możesz go załatwić przez LEFT JOIN z użyciem NULL. Czyli:
SELECT n.* FROM nowa n LEFT JOIN stara s ON s.id=n.id WHERE s.id IS NULL

W tym drugim musisz doczytać jak się zachowuje warunek we WHERE, a jak w (LEFT) JOIN.
Pza tym, jak dajesz we WHERE warunek na tabelę z LEFT JOIN (oprócz sprawdzenia IS NULL), to tego LEFT możesz sobie darować...
Go to the top of the page
+Quote Post
lukpio3
post 14.01.2017, 19:42:03
Post #3





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 1.05.2010

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


Jeżeli użyję klauzuli WHERE czyli zrobię:
  1. SELECT Z.ID_ZAP, Z.DATA_1, Z_DATA_2 .....
  2. FROM ZAPYTANIA Z
  3. LEFT JOIN STATUSY S ON Z.ID_ZAP = S.ID_ZAP
  4. WHERE S.STATUS != 'Zakończono'
  5. ORDER BY ID_ZAP DESC


To oczywiście nie pokazuje mi wierszy gdzie status jest równy Zakończono ale też nie pokazuje mi wierszy z pierwszej tabeli dla których w drugiej kompletnie nie ma nic a tak nie może być. Pokazuje mi wtedy wyłącznie część wspólną obu tabel co jest błędem. Siedzę, kombinuję, nie mogę tego rozgryźć. Bo tabela 1 ma kilkaset wierszy, tabela druga tylko kilkadziesiąt ponieważ była niedawno dołożona. Muszę wyświetlić wszystkie rekordy których nie mogę z JOIN-ować z tabelą 2 + rekordy które się JOIN-ują ale pod warunkiem że status z tabeli 2 jest różny od Zakończono.

Ten post edytował lukpio3 14.01.2017, 19:42:33
Go to the top of the page
+Quote Post
trueblue
post 14.01.2017, 21:08:08
Post #4





Grupa: Zarejestrowani
Postów: 5 492
Pomógł: 1502
Dołączył: 11.03.2014

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


  1. WHERE S.STATUS != 'Zakończono' OR S.STATUS IS NULL


--------------------
Go to the top of the page
+Quote Post
lukpio3
post 14.01.2017, 22:34:50
Post #5





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 1.05.2010

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


Co prawda rozwiązałem już problem poprzez kilka selectów ale to mało eleganckie rozwiązanie. Dodałem do tego co miałem Twój warunek i działa. Dzięki wielkie za pomoc. O to właśnie chodziło. Próbowałem robić tak jak napisałeś z NULL-em ale dawałem złe złączenie bo robiłem AND zamiast OR co było moim błędem. Jeszcze raz dziękuję smile.gif
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: 16.09.2019 - 13:59