Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: select wraz z joinem z pustymi wartościami
Forum PHP.pl > Forum > Bazy danych > MySQL
_chris_
Witam
Kolejny raz zwaracam się z prośbą do was.
Mam 2 tabele:

firma:
idFirmy, nazwa i coś tam jeszcze nieważne

umowy
idUmowy, numer, idFirmy, archiwalna i coś tam jeszcze

Jedna firma może mieć kilka umów, z czego tylko jedno która nie jest archiwalna. Jak dodajemy nową umowę, to inne umowy są oznaczane jako archiwalne.

Główkuje już dość długi czas nad zapytaniem pobierającym do dataGrida listę:
Wszystkich firm, a w ostatniej kolumnie numer ostatniej umowy, a jeśli nie ma umowy przypisanej do firmy, to puste pole:

1 | Firma Kogucik | Numer umowy
2 | Firma inna |
3 | Jeszcze inna | Inny numer

skleciłem:
  1. SELECT * FROM firmy f LEFT JOIN umowy u ON f.id = u.idFirmy


Jest całkiem ok, wyświetla mi wszystkie firmy nawet te które nie mają umów w tabeli umowy, ale jeśli jakaś firma ma kilka umów, to powtarza mi je.

Jeśli zrobię tak:
  1. SELECT * FROM firmy f LEFT JOIN umowy u ON f.id = u.idFirmy WHERE u.archiwalna = false


wtedy wybiera z kolei tylko te firmy, które mają jakąś umowę

Zastanawiam się czy istnieje taka możliwość wyboru tych danych.

Z góry dzięki za wskazówki.
trafas
Przy założeniu że tylko jedna umowa może być niearchiwalna to możesz to zrobić tak:

  1. SELECT
  2. f.*,
  3. (SELECT numer FROM umowy u WHERE u.idFirmy=f.idFirmy AND u.archiwalna = false) AS 'Numer umowy'
  4. FROM firmy f



Lub bezpieczniej, gdyby jednak się trafiły dwie umowy niearchiwalne:

  1. SELECT
  2. f.*,
  3. (SELECT top 1 numer FROM umowy u WHERE u.idFirmy=f.idFirmy AND u.archiwalna = false) AS 'Numer umowy'
  4. FROM firmy f


Ewentualnie spróbuj tak:

  1. SELECT *
  2. FROM firmy f
  3. LEFT JOIN umowy u
  4. ON f.id = u.idFirmy AND u.archiwalna = false
maly_swd
hmmm u.archiwalna = false questionmark.gif czy w mysql jest pole false/true?

raczej powinno byc u.archiwalna is null
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.