Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Relacja wiele do wielu - wyciąganie danych
Sierak
post
Post #1





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

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


Walcze z tym od wczoraj i pomyslalem ze moze wy mnie nakierujecie na rozwiazanie. Chodzi o odpowiednie wyciagniecie danych z tabeli ktora jest relacja wiele do wielu dla dwoch innych tabel.

Wyglada to mniej wiecej tak w duzym skrocie:
tabela: hardware
HardID 1
HardID 2
HardID 3

tabela: software
SoftID 10
SoftID 11
SoftID 12

tabele: cthardtosoft
HardID 1; SoftID 10
HardID 1; SoftID 11
HardID 1; SoftID 12
HardID 2; SoftID 10
HardID 2; SoftID 11
HardID 3; SoftID 10

Zapytanie w postaci listy wszystkich komputerow ktore POSIADAJA jakis soft to prosta sprawa. Ale mam klopot z odwrotna sytujacja. Chce liste komputerow ktore np. NIE POSIADAJA softu o ID 12

Probowalem w taki sposob ale mam przeklamane dane:
  1. SELECT h.*, count(hs.HardID) AS liczba
  2. FROM hardware AS h
  3. LEFT JOIN cthardtosoft AS hs ON (h.HardID = hs.HardID)
  4. WHERE h.HardID IS NULL OR hs.SoftID != '12' GROUP BY hs.HardID HAVING liczba <= 1


lub tak:
  1. SELECT * FROM hardware WHERE HardID
  2. IN (
  3. SELECT HardID FROM cthardtosoft WHERE SoftID != '12' GROUP BY HardID HAVING count(*) <= 1
  4. )


Jezeli mam wybierac to wolalbym jedno zapytanie, bez podzapytan.
Mam do dyspozycji MySQL 4.1
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




hmmmm, tak teoretycznie, bez sprawdzania:
  1. SELECT * FROM hardware H LEFT JOIN cthardtosoft HS ON (HS.HardID=H.HardID AND HS.SoftID=12) WHERE HS.HardID IS NULL


ps: i niech cie nie zmyli ten warunek: HS.SoftID=12. tak ma byc (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
bendi
post
Post #3





Grupa: Zarejestrowani
Postów: 401
Pomógł: 5
Dołączył: 14.09.2003
Skąd: Wrocław

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


Cytat(nospor @ 22.06.2006, 09:27 ) *
ps: i niech cie nie zmyli ten warunek: HS.SoftID=12. tak ma byc (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)


Mam takie pytanie w stylu "a dlaczego tak?" (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Wiem, że to działa i wiem, że jest poprawne, ale moje pytanie jest trochę innej natury. Chodzi o umieszczenie tego warunku przy złączeniu. Otóż ten sam waunek możemy dołożyć do części WHERE i też będzie działało. Jaka jest różnica. Czy dodanie do warunku na złączenie zapobiega dorzuceniu do macierzy rekordów nie spełniających tego warunku a wrzucenie na w WHERE spowodowałoby przemielenie wszystkich wyników i dopiero późniejsze wyciągnięcie tego co trzeba?
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 29.09.2025 - 18:59