Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Podzapytanie, MySQL 4.0, problem z zapytaniem
Sierak
post
Post #1





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 1.04.2004
Skąd: Warszawa

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


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.

Ten post edytował Sierak 16.02.2006, 13:51:58
Go to the top of the page
+Quote Post
tort
post
Post #2





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 15.09.2005
Skąd: Lublin

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


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.


--------------------
tort
eX Blog
Go to the top of the page
+Quote Post
Sierak
post
Post #3





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 1.04.2004
Skąd: Warszawa

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


@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.
Go to the top of the page
+Quote Post
tort
post
Post #4





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 15.09.2005
Skąd: Lublin

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


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.


--------------------
tort
eX Blog
Go to the top of the page
+Quote Post
Sierak
post
Post #5





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 1.04.2004
Skąd: Warszawa

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


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;


Ten post edytował Sierak 16.02.2006, 22:24:03
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 Aktualny czas: 19.08.2025 - 21:59