Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Podzapytanie, MySQL 4.0
Forum PHP.pl > Forum > Bazy danych > MySQL
Sierak
Mam problem z jednym zapytaniem. Mam do dyspozycji TYLKO MySQL 4.0 i nie moge zastosowac podzapytan. Sytuacja przedstawia sie w ten sposob:

Dwie tabele:
Hardware
HardID

Software
SoftID
HardID

W pierwszej tabeli trzymam sprzet a w drugiej tabelki trzymam oprogramowanie dla tego sprzetu. Jeden sprzet moze miec klika oprogramowan co realizawane jest w tabeli Software.

Teraz moj problem polega na tym iz potrzebuej napisac zapytanie ktore pokaze mi wszystkie komputery ktore NIE posiadaja danego oprogramowania.

Zalozmy ze Windows XP ma SoftID = 20.

  1. SELECT h.HardID
  2. FROM hardware
  3. AS h, cthardtosoft AS s
  4. WHERE h.HardID = s.HardID AND s.SoftID != '20'
  5. GROUP BY h.HardID


Cos takiego generuje mi zle dane a to z tego wzgledu iz zapytanie owszem eliminuje rekordy z tabeli ktore posiadaja SoftID = 20 ale jezeli dany sprzet posiada tez jakies inne oprogramowanie to tak czy siak zostanie wyswietlony a nie powinien. Probowalem tez z LEFT JOINAMI ale nim mi to nie pomoglo.

Dodam jeszcze iz wartosci SoftID moze byc kilka, co realizuje wyszukwanie sprzetu ktory nie posiada kilku oprogramowan.
czyli ...
- jezeli w wyszukiwarce zaznacze ze NIE chce corela to ma nie wyswietlac tych co nie maja corela
- a jezeli w wyszukiwarce zaznacze ze ma nie miec corela ORAZ xp to ma nie wyswietlac tych co nie maja i tego i tego

Chce dzieki temu uzyskac informacje ile licencji mam dokupic ... tak to mozna sobie tlumaczyc.
tort
To czego szukasz powinno wyglądać mniej więcej tak:
  1. SELECT DISTINCT h.*
  2. FROM hardware
  3. h LEFT JOIN software s ON h.HardId=s.HardId WHERE s.SoftId=1 AND s.HardId IS NULL ORDER BY h.HardId

lub
  1. SELECT DISTINCT h.*
  2. FROM hardware
  3. h LEFT JOIN software s ON h.HardId=s.HardId WHERE s.SoftId IN (1, 2, 3, 4) AND s.HardId IS NULL ORDER BY h.HardId

Tak przynajmniej mówi manual MySQLa.
Sierak
@tort

Nie wiem co ma powodowac WHERE s.SoftId=1 w twoim pierwszym zapytaniu. Ale tak czy siak niestety to nie rozwiązuje tego problemu. Za prosto by bylo ...

... LEFT JOIN owszem polaczy mi wszystkie rekordy obu
tabel, ORDER BY spowoduje ze bedzie zwracany tylko jeden HardID ale takie rozwiazanie wcale nie wykluczy mi sytuacji kiedy

w hardware mamy:
HardID = 10
HardID = 11

w software mamy:
HardID = 10; SoftID = 2
HardID = 10; SoftID = 3
HardID = 10; SoftID = 5
HardID = 11; SoftID = 5

teraz chce wyswietlic wszystkie HardID ktore w tabeli software maja SoftID != 3. Twoje zapytanie zwroci mi zarowno HardID = 10 jak rowniez HardID = 11 a nie po to chodzi.
tort
Hmmm... możliwe. Ale jak się okazuje nie wszystkie zapytania z podzapytaniami da się napisać bez wykorzystania podzapytań. Jakbym miał dostęp do bazy danych, o której rozmawiamy, to na pewno byłoby mi łatwiej urzeźbic odpowiednie zapytanie.
Sierak
Cytat(tort @ 2006-02-16 23:18:27)
Hmmm... możliwe. Ale jak się okazuje nie wszystkie zapytania z podzapytaniami da się napisać bez wykorzystania podzapytań. Jakbym miał dostęp do bazy danych, o której rozmawiamy, to na pewno byłoby mi łatwiej urzeźbic odpowiednie zapytanie.


Tez mi sie wlasnie wydaje ze to moze nie byc takie latwe. Moze to jakos na tablice tymczasowe rozpisac ale nie mam pomyslu jak. A baza ... prosze bardzo, mozna w minutke stworzyc te dwie tabelki i potestowac na nich.

  1. CREATE TABLE `hardware` (
  2. `HardID` int(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. PRIMARY KEY (`HardID`)
  4. ) TYPE=MyISAM AUTO_INCREMENT=1 ;
  5.  
  6. CREATE TABLE `software` (
  7. `HardID` int(5) NOT NULL DEFAULT '0',
  8. `SoftID` int(5) NOT NULL DEFAULT '0',
  9. PRIMARY KEY (`HardID`,`SoftID`)
  10. ) TYPE=MyISAM;
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.