Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Zapytanie, 2 tabele
Forum PHP.pl > Forum > Przedszkole
kleszczoscisk
Witam i proszę o pomoc

Mam 2 tabele w bazie MySQL:

Kod
PYTANIA
    wp_id int(11)     UNSIGNED     auto_increment         
    wp_pytanie     text     
    wp_kategoria int(2)


Kod
ODPOWIEDZI
    wo_id     int(11)         UNSIGNED     auto_increment     
    wo_pytanie     int(11)             
    wo_osoba     int(11)             
    wo_odpowiedz     text


W tabeli PYTANIA przechowywane są pytania. W tabeli ODPOWIEDZI są udzielone odpowiedzi.
Ludzie dowolnie wybierają sobie pytania i udzielają na nie odpowiedzi.
Chcę wyświetlić danej osobie (wo_osoba) wszystkie(!) pytania i jeśli udzielił jakiejś odpowiedzi - wyświetlić tę odpowiedź.
Jak skonstruować zapytanie ?
Poniższe zapytanie wyświetla mi tylko te pytania do których są przyporządkowane odpowiedzi.
  1. $zapytanie = "SELECT * FROM `pytania`
  2. JOIN `odpowiedzi` ON (pytania.wp_id = odpowiedzi.wo_pytanie)
  3. WHERE
  4. wywiad_odpowiedzi.wo_osoba = $sess_id ";

Próbuję też tak, ale nie działa tak jak powinno:
  1. $zapytanie = "SELECT * FROM `pytania`
  2. LEFT OUTER JOIN `odpowiedzi` ON (pytania.wp_id = odpowiedzi.wo_pytanie)
  3. WHERE
  4. wywiad_odpowiedzi.wo_osoba = $sess_id ";
nekomata
kurde nie za bardzo rozumiem po co ci dwie tabele? nie możesz mieć jednej tabeli?
  1. ODPOWIEDZI
  2. wo_id int(11) UNSIGNED AUTO_INCREMENT
  3. wo_pytanie text
  4. wo_osoba int(11)
  5. wo_odpowiedz text

i teraz nie wiem czy cie dobrze rozumiem ale wydaje mi się ze chodzi ci o coś takiego(już jakbyś miał jedna bazę)
  1. require_once('mysqli_connect.php');
  2. $qf = "SELECT * FROM pytania WHERE";
  3. $id = mysqli_query($dbc,$qf);
  4.  
  5. while($pytania = mysqli_fetch_array($id,MYSQLI_ASSOC)){
  6. echo $pytania['wo_pytanie'];
  7. if(!empty($pytania['wo_odpowiedz'])){
  8. echo $pytania['wo_odpowiedz']
  9. }
  10. }
(nawet nie wiem czy ten kod by działał.. tak tylko obrazuje)ale prawdopodobnie cie źle zrozumiałem
kleszczoscisk
Dwie tabele po to aby nie powtarzać przy każdej odpowiedzi treści pytania. Byłem przekonany, że tak jest prawidłowo: jedna tabela z pytaniami: id i tresc pytania, druga z odpowiedziami wszystkich osób, przyporządkowanych do pytań (po nr id). Krótko mówiąc: dla jednego pytania, tyle odpowiedzi ile jest osób...
Jest jakiś sposób aby uzyskać wszystkie pytania i odpowiedzi do nich jeśli są, dla wybranej osoby ?
nekomata
  1. require_once('mysqli_connect.php');
  2. $qf = "SELECT * FROM pytania WHERE";
  3. $id = mysqli_query($dbc,$qf);
  4. $qfa = "SELECT * FROM odpowiedzi WHERE wo_osoba=costam";
  5. $ida = mysqli_query($dbc,$qfa);
  6. while($pytania = mysqli_fetch_array($id,MYSQLI_ASSOC)){
  7. echo $pytania['wo_pytanie'];
  8. while($pytaniaa = mysqli_fetch_array($ida,MYSQLI_ASSOC)){
  9. echo $pytania['wo_odpowiedz'];
  10. }
  11. }

Coś takiego?Szczerze to się dopiero sam uczę ale .. staramy się przede wszystkim!
mortus
@nekomata To jest jakiś pomysł, ale nie do końca dobry. Twój kod przy każdym pytaniu wyświetli wszystkie odpowiedzi dla danej osoby. Potrzebna jest jego mała modyfikacja, ale i tak rozwiązanie to nie będzie optymalne.

@kleszczoscisk LEFT OUTER JOIN powinien załatwić sprawę. Dlaczego więc "nie działa tak jak powinno"? Co się dzieje, jakie dane wyświetla i dlaczego nie są one prawidłowe?
nekomata
hmmm mała modyfikacja.. oświeciło mnie dopiero jak mi powiedziałeś ;P
  1. require_once('mysqli_connect.php');
  2. $qf = "SELECT * FROM pytania WHERE";
  3. $id = mysqli_query($dbc,$qf);
  4. $qfa = "SELECT * FROM odpowiedzi WHERE wo_osoba=costam AND ".$pytania[wo_pytanie_id];
  5. $ida = mysqli_query($dbc,$qfa);
  6. while($pytania = mysqli_fetch_array($id,MYSQLI_ASSOC)){
  7. echo $pytania['wo_pytanie'];
  8. while($pytaniaa = mysqli_fetch_array($ida,MYSQLI_ASSOC)){
  9. echo $pytaniaa['wo_odpowiedz'];
  10. }
  11. }
nie wiem czy coś takiego by zadziałało nawet no i tak jak mówisz... to nie jest optymalne
kleszczoscisk
Cytat(mortus @ 17.11.2010, 09:41:23 ) *
@kleszczoscisk LEFT OUTER JOIN powinien załatwić sprawę. Dlaczego więc "nie działa tak jak powinno"? Co się dzieje, jakie dane wyświetla i dlaczego nie są one prawidłowe?


  1. $pytania_zapytanie = "SELECT * FROM `wp` LEFT OUTER JOIN `wo` ON (`wp`.`wp_id` = `wo`.`wo_pytanie`) WHERE `wo`.`wo_artysta` = $sess_id ";


Kod
Array
(
    [0] => 2
    [wp_id] => 2
    [1] => Jak często malujesz kobiety ?
    [wp_pytanie] => Jak często malujesz kobiety ?
    [2] => 0
    [wp_kategoria] => 0
    [3] => 1
    [wo_id] => 1
    [4] => 2
    [wo_pytanie] => 2
    [5] => 2
    [wo_osoba] => 2
    [6] => Wcale nie maluję
    [wo_odpowiedz] => Wcale nie maluję
)


Serdeczne dzięki za odpowiedzi, po południu będę sprawdzał bo teraz muszę wyjść.
mortus
Zapytanie z LEFT OUTER JOIN psuje klauzula WHERE. Rozwiązanie:
  1. $zapytanie = "SELECT * FROM pytania p LEFT OUTER JOIN odpowiedzi o ON p.wp_id=o.wo_pytanie AND o.wo_osoba=$sess_id";

Jak myślisz, dlaczego zapytanie z WHERE nie działa?

@nekomata Jeśli już to tak:
  1. require_once('mysqli_connect.php');
  2. $sql1 = "SELECT * FROM pytania";
  3. $wynik1 = mysqli_query($dbc, $sql1);
  4. while($wiersz1 = mysqli_fetch_array($wynik1, MYSQLI_ASSOC)) {
  5. echo $wynik1['wp_pytanie'] . '<br>';
  6. $sql2 = "SELECT * FROM odpowiedzi WHERE wo_pytanie=$wiersz1['wp_id'] AND wo_osoba=costam";
  7. $wynik2 = mysqli_query($dbc, $sql2);
  8. // jeżeli otrzymaliśmy jakieś wiersze to je przetwarzamy
  9. // a tutaj wszystko zależy od tego, czy może być więcej niż jedna odpowiedź na dane pytanie
  10. // jeżeli nie ma wierszy, to nic nie robimy
  11. $wiersz2 = mysqli_fetch_array($sql2, MYSQLI_ASSOC);
  12. echo $wiersz2['wo_odpowiedz'] . '<br>';
  13. }
To tak mniej więcej, bo trzeba jeszcze wspomniany warunek dopisać. Jednak gołym okiem widać, że rozwiązanie to nie jest optymalne, bo drugie zapytanie wykonujemy nawet wtedy, gdy dana osoba nie udzieliła odpowiedzi na któreś pytanie.
kleszczoscisk
Dzięki serdeczne wszystkim za pomoc, @mortus:
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.