Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jedno zapytanie dla "jeden do wielu"
Forum PHP.pl > Forum > Bazy danych > MySQL
snapshot
Mam tabele:

ankieta (id, pytanie)

odpowiedzi (id, idAnkieta, Odpowiedź)

Czy da się jakoś wyciągnąć jednym zapytaniem pytanie i odpowiedzi znając id ankiety? Można to zrobić wyciągają wszystkie opowiedzi dla idAnkiety i joinem połączyć z ankietą, ale wtedy każdy wiersz będzie miał pytanie. Da się to zrobić poprawniej?

Podobny problem mam z postami na forum. Wyciągam sobie wszystkie posty, dodatkowo każdy post może zostać pochwalony. O ile wyciągnięcie ilości pochwał dla danego postu nie sprawia mi trudności (count()), to wyciągnięcie postów i osób dla każdej wiadomości, które ją pochwaliły pochwaliły, sprawia mi problem.
seth-kk
Cytat(snapshot @ 28.05.2009, 19:07:50 ) *
Czy da się jakoś wyciągnąć jednym zapytaniem pytanie i odpowiedzi znając id ankiety? Można to zrobić wyciągają wszystkie opowiedzi dla idAnkiety i joinem połączyć z ankietą, ale wtedy każdy wiersz będzie miał pytanie. Da się to zrobić poprawniej?

a co w tym niepoprawnego?
w alternatywie masz UNION i oddzielne zapytania
snapshot
Niechodzi że nie poprawnie. Pytam się czy da się może lepiej. A co z drugim problemem?
seth-kk
pewnie tez join tylko na wiekszej liczbie tabel
bez ich budowy ciezko powiedziec jak bedzie wygladal
snapshot
W uproszczeniu:

Posts (idPost ...),
Users (idUser , idCountry...),
Countries (idCountry ...)
Reputations (idPost, idUser)


Aktualnie mam takie zapytanie

  1. SELECT `p`.*, COUNT(r.idPost) AS `reputation`, `u`.`login`, `c`.`code` AS `countryCode`, `c`.`name` AS `countryName`
  2. FROM `posts` AS `p`
  3. LEFT JOIN `reputations` AS `r` ON p.idPost = r.idPost
  4. INNER JOIN `users` AS `u` ON p.idUser = u.idUser
  5. LEFT JOIN `countries` AS `c` ON u.userCountry = c.idCountry
  6. WHERE (p.idTopic = '21')
  7. GROUP BY `p`.`idPost`


I zwraca ono posty z danego tematu, punkty reputacji dla danego postu, z userami i krajami z jakich pochodzą. Chcę żeby dodatkowo można było wyciągnąć loginy osób które dały punkty reputacji za wiadomość.
DK.log
Nie neguje innych rozwiązań, ale ja spróbowałbym dość prostym i sprawdzonym już przeze mnie sposobem:
  1. <?php
  2. print "<table>";
  3. $wynik_ank = mysql_query ("SELECT * FROM ankieta") or die ("bład w pytaniu");
  4.  
  5. while ($rekord = mysql_fetch_assoc ($wynik_ank)) {
  6.   $id = $rekord['id'];
  7.   $pytanie = $rekord['pytanie'];
  8.   print "<tr><td>$$pytanie</td>";
  9.   print "<td>";
  10.   $wynik_odp = mysql_query ("SELECT * FROM odpowiedzi WHERE idAnkieta LIKE '$id' ") or die ("bład w pytaniu");
  11.    while ($rek = mysql_fetch_assoc ($wynik_odp)) {
  12.    $id_odp = $rek['id'];
  13.        $odpowiedz =  $rek['Odpowiedź'];
  14.        print "Odp nr $id_odp: $odpowiedz"</br>;
  15.        }
  16.   print "</td></tr>";
  17.   }
  18. print "</table>";
  19. ?>
nexis
Cytat(snapshot @ 28.05.2009, 19:07:50 ) *
Czy da się jakoś wyciągnąć jednym zapytaniem pytanie i odpowiedzi znając id ankiety? Można to zrobić wyciągają wszystkie opowiedzi dla idAnkiety i joinem połączyć z ankietą, ale wtedy każdy wiersz będzie miał pytanie. Da się to zrobić poprawniej?

Tak jest właśnie poprawnie, a jeżeli chcesz to rozdzielić to jak najbardziej poprawnie będzie zastosowanie dwóch zapytań. Czemu się przed tym bronisz?
snapshot
Chodzi oto, żeby uzyskać jak najbardziej optymalne i wygodne rozwiązanie. Skoro piszecie, że dobrze myślę, to jest ok. Męczy mnie jeszcze ta reputacja...
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.