Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] pobieranie danych z dwóch tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
SaMi
Witam,
Mam dwie tabele WYDARZENIA i PLIKI każde z wydarzeń może mieć przypisany co najmniej jeden plik.
Chcę teraz pobrać z bazy konkretne jedno wydarzenie i wszystkie przypisane do niego pliki o ile w ogle jakieś zostały do tego wydarzenia przypisane; i teraz pytanie pierwsze czy lepiej rozbić to na dwa zapytania czy kombinować z jednym.
Dwa zapytania nie stanowią problemu, gorzej jest z jednym zapytaniem, na razie stworzyłem coś takiego:

  1. SELECT w.id, og.tytul, w.tresc, p.nazwa_pliku
  2. FROM wydarzenia AS w
  3. LEFT JOIN pliki AS p ON ( w.id = p.id_powiazanie )
  4. WHERE w.id = '1'


Niestety jeśli jest więcej niż jeden plik to dane o wydarzeniu są wyświetlane tyle razy ile jest plików.
Tu też kończą się moje pomysły i wiedza z zakresu języka SQL.
Teraz pytanie drugie; czy da się w ogóle osiągnąć wspomniany wyżej cel jeśli tak to poprosił bym o jakieś podpowiedzi lub wskazówki.
kiciafu

"Niestety jeśli jest więcej niż jeden plik to dane o wydarzeniu są wyświetlane tyle razy ile jest plików."

No dokładnie tak, a Ty jak chcesz żeby to wyświetliło? Nie wiem czy dobrze Cię rozumiem ale to jest relacja jeden do wielu, jeżeli będziesz miał jedno wydarzenie i 5 plików tego wydarzenia to wyniku będziesz miał id wydarzenia i 5 id plików z nim związanych (jeżeli robisz złączenie z dwóch tabel)
SaMi
Tak jest to relacja jeden do wielu, wnioskuję z tego że najlepszym rozwiązaniem będą tu po prostu dwa zapytania ?
kiciafu
jeżeli chcesz zrobić zapytanie a potem zapytanie do wyniku tego zapytania to może spróbuj zrobić zapytanie zagnieżdżone o ile masz MySQL w wersji co najmniej 4 bodajże
kefirek
  1. $q=mysql_query("SELECT w.id, og.tytul, w.tresc, p.nazwa_pliku
  2. FROM wydarzenia AS w
  3. INNER JOIN pliki AS p ON ( w.id = p.id_powiazanie )
  4. WHERE w.id = '1' ORDER BY og.tytul");
  5. $cat = 0;
  6. while($r=mysql_fetch_array($q))
  7. {
  8. if($r['tytul'] != $cat){
  9.  
  10. echo '<b>Tytul: '.$r['tytul'].'</b><br />';
  11.  
  12. }
  13.  
  14. echo 'Nazwa Pliku: '.$r['nazwa_pliku'].'<br />';
  15.  
  16. $cat = $r['tytul'];
  17.  
  18. }
Hpsi
  1. GROUP BY `w`.`id`
dorzuć to do zapytanka

Czyli spróbuj takie zapytanie:
  1. SELECT w.id, og.tytul, w.tresc, p.nazwa_pliku
  2. FROM wydarzenia AS w
  3. LEFT JOIN pliki AS p ON ( w.id = p.id_powiazanie )
  4. GROUP BY `w`.`id`
  5. WHERE w.id = '1'
SaMi
  1. SELECT w.id, og.tytul, w.tresc, p.nazwa_pliku
  2. FROM wydarzenia AS w
  3. LEFT JOIN pliki AS p ON ( w.id = p.id_powiazanie )
  4. WHERE w.id = '1'
  5. GROUP BY w.id


WHERE musi być przed GROUP BY wynika to z samej specyfiki klauzuli WHERE (Wiersze nie spełniające warunków określonych w klauzuli WHERE są eliminowane przed grupowaniem)

Bynajmniej ten zapis pobiera jedno wydarzenie z jednym plikiem ostatnio dodanym. Mimo to dziękuję smile.gif
Hpsi
Wybacz - źle doczytałem twój temat, i z miejscem usadownienia group dalem gafe smile.gif (nie pierwsza dzis) .
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.