Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie z NOT EXISTS
Forum PHP.pl > Forum > Bazy danych > MySQL
matino
Hej,

Mam takie oto 2 tabele:
  1. tabela A:
  2.  
  3. nr | email
  4.  
  5. tabela B:
  6.  
  7. nr | data1 | data2


W tabeli A kolumna nr jest kluczem, natomiast w tabeli B nie (jeden nr może występować wiele razy).
Załóżmy, że mamy takie dane w tabeli B (nr 1 jest również obecny w tabeli A):
  1. 1 | 12345 | 12349
  2. 1 | NULL | 20000
  3. 1 | NULL | NULL


Próbuję wyciągnąć numery na zasadzie: nr | MAX(data1 dla danego nr) | MAX(data2 dla danego nr) | email chyba, że dla danego nr-u oba pola data1 i data2 są puste -> wtedy wyciągam nr | null | null | email.

Napisałem coś takiego:

  1. SELECT B.nr, MAX(data1), MAX(data2), email FROM `A` JOIN `B` ON A.nr =B.nr WHERE NOT EXISTS (SELECT * FROM `B` WHERE B.data1 = '' AND B.data2 = '' GROUP BY B.nr) GROUP BY B.nr


ale wynik jest pusty... Macie może jakiś pomysł jak to poprawić?
mkozak
Początek miałeś dobry:

  1. SELECT B.nr, MAX(data1), MAX(data2), email FROM `A` JOIN `B` ON A.nr =B.nr WHERE B.data1 = IS NOT NULL OR B.data2 IS NOT NULL GROUP BY B.nr
matino
Dzięki ale nie do końca o to mi chodziło.
Dla danych:

  1. 1 | 12345 | 12349
  2. 1 | NULL | 20000
  3. 1 | NULL | NULL
  4. 2 | 21000 | 20002
  5. 2 | NULL | 56789


Wynik powinien być:

  1. 1 | NULL | NULL
  2. 2 | 21000 | 56789


Jeśli dany nr ma w jakimś rzędzie obie kolumny data puste, to powinien być zwracany
  1. nr | NULL | NULL

Jeśli natomiast nie ma obu kolumn pustych dla danego nr-u w tabeli, to zwracamy
  1. nr | MAX(data1) | MAX(data2)

mkozak
Tośmy się nie zrozumieli

  1. SELECT B.nr, MAX(data1), MAX(data2), email FROM `A` JOIN `B` ON A.nr =B.nr WHERE (B.data1 = IS NOT NULL AND B.data2 IS NOT NULL) OR (B.data1 = IS NULL AND B.data2 IS NULL ) GROUP BY B.nr
matino
Ciągle nie o to mi chodzi. Generalnie wydaje mi się, że nie da rady tego ładnie zrobić jednym zapytaniem (ale może się mylę).
Zrobiłem w końcu tak:
  1. SELECT * FROM `B` WHERE B.data1 = '' AND B.data2 = '' GROUP BY B.nr

W PHP wynik zrzuciłem do tablicy
  1. $no_data_cases
. Następnie:
  1. SELECT B.nr, MAX(data1), MAX(data2), email FROM `A` JOIN `B` ON A.nr =B.nr GROUP BY B.nr

I w pętli:
  1. while ($row = mysql_fetch_array($result)) {
  2. if (in_array($row[B.nr], $no_data_cases))
  3. echo "No data";
  4. else
  5. echo "Data";
  6. }
mkozak
Racja - bo tam są MAX-y i agregacja group-em, więc null-i nie będzie.

  1. SELECT B.nr, MAX(data1) data1, MAX(data2) data2, email FROM `A` JOIN `B` ON A.nr = B.nr WHERE (B.data1 IS NOT NULL AND B.data2 IS NOT NULL) GROUP BY B.nr
  2.  
  3. UNION
  4.  
  5. SELECT B.nr, data1, data2, email FROM `A` JOIN `B` ON A.nr = B.nr WHERE (B.data1 IS NULL AND B.data2 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.