Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SOLVED][SQL] SELECT + JOIN + ? - pomoc z zapytaniem
barry853
post
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 14.02.2010

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


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 ((IMG:style_emoticons/default/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ć)

Ten post edytował barry853 6.02.2011, 12:17:34
Go to the top of the page
+Quote Post
trafas
post
Post #2





Grupa: Zarejestrowani
Postów: 87
Pomógł: 12
Dołączył: 31.05.2006

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


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





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 14.02.2010

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


@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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

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: 19.09.2025 - 12:21