Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SOLVED][SQL] SELECT + JOIN + ? - pomoc z zapytaniem
Forum PHP.pl > Forum > Bazy danych > MySQL
barry853
Witam,

Chciałbym Was prosić o pomoc z zapytaniem. Mam bazę o mniej więcej takiej strukturze relacji:

OWNER * - * CAR

Dane wejściowe to zbiór id'ków samochodów. Zapytanie ma pobierać tych właścicieli, którzy posiadają każdy (exclamation.gif) z samochodów, który zawarty jest w podanym zbiorze.

Czyli np.
- właściciel WA posiada samochody CA i CB, a WB posiada tylko CA - wywołanie zapytania pobierzWłaścicieli( array(CA.id, CB.id) ) musi dać w wyniku tylko WA - nie można więc użyć struktury WHERE id IN , po w wyniku dostalibyśmy też WB (a przynajmniej ja nie wiem jakby się miała ona przydać)
trafas
Witam,

Zakładając że masz takie tabele:

  1. CREATE TABLE owners
  2. (
  3. id_own int,
  4. own_name varchar(50)
  5. )
  6.  
  7.  
  8. CREATE TABLE cars
  9. (
  10. id_car int,
  11. car_name varchar(50)
  12. );
  13.  
  14.  
  15. CREATE TABLE posiadanie
  16. (
  17. id_own int,
  18. id_car int
  19. );
  20.  


Z takimi danymi wejściowymi:

  1.  
  2. INSERT INTO owners VALUES(1,'WA');
  3. INSERT INTO owners VALUES(2,'WB');
  4.  
  5. INSERT INTO cars VALUES(1,'CA');
  6. INSERT INTO cars VALUES(2,'CB');
  7.  
  8. INSERT INTO posiadanie VALUES(1,1);
  9. INSERT INTO posiadanie VALUES(1,2);
  10. INSERT INTO posiadanie VALUES(2,1);


To twoje zadanie rozwiąże funkcja:

  1. function pobierzWlascicieli(array $dane)
  2. {
  3. $ile_samochodow = count($dane);
  4. $samochody = "'".implode("','",$dane)."'";
  5.  
  6. $query = "
  7. select id_own
  8. from posiadanie
  9. where
  10. id_car in($samochody)
  11. group by id_own
  12. having count(*) = $ile_samochodow";
  13.  
  14. $result = mysql_query($query);
  15. $wyniki = mysql_num_rows($result);
  16.  
  17. if($wyniki > 0)
  18. {
  19. echo "Właściciele spełniający warunki: <br />";
  20. for($i = 1; $i <= $wyniki; $i++)
  21. {
  22. $dane = mysql_fetch_array($result);
  23. echo $dane[0]."<br />";
  24. }
  25. }else{
  26. echo "Brak wyników";
  27. }
  28. return 0;
  29. }


Wywołanie funkcji:

  1. $dane_wej = array (1,2);
  2. pobierzWlascicieli($dane_wej);



W tabeli posiadanie masz przypisania właściciel -> samochód.
Funkcja pobiera dane wejściowe w postaci tablicy, sprawdza ilość podanych "samochodów", składa identyfikatory w tablicę którą może zczytać sql.

Generalnie cały problem rozwiązuje warunek having.

Pozdrawiam.
barry853
@trafas

Dzięki wielkie!

Powiem tak - jak przeczytałem Twoje rozwiązanie, to pomyślałem - aha, błąd kolego, bo przecież jak dodam właściciela WC i samochód CC, gdzie właściciel WC ma samochody CB i CC to mi zwróci zły wynik

Czyli:
- WA - (CA),
- WB - (CA, CB),
- WC - (CB,CC) )

sądziłem że zapytanie dla CA CB zwróci mi właścicieli WB i WC, po warunek HAVING będzie się zgadzał a WHERE IN nie pomoże. Z HAVING też próbowałem wcześnie, ALE ! - zacząłem pisać Twojego SQL'a u siebie żeby to udowodnić. Ja stosuję ORM Doctrine, a tam się raczej zapomina o tabelach asocjacyjnych i zapytaniach na nich. Widać skrzywienie i przez to później problem z SQL'em zwykłym smile.gif. Dopiero sobie zdałem sprawę, że robisz zapytanie właśnie na tabeli asocjacyjnej, a nie na owner jak to ja robiłem używając Doctrine'owego DQL'a.

Czułem, że to jest jakiś banał, ale za nic nie mogłem skojarzyć tego prostego rozwiązania, dzięki smile.gif
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.