Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Zapytanie, 2 tabele
kleszczoscisk
post
Post #1





Grupa: Zarejestrowani
Postów: 164
Pomógł: 3
Dołączył: 13.12.2007

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


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 ";


Ten post edytował kleszczoscisk 16.11.2010, 23:02:25
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
nekomata
post
Post #2





Grupa: Zarejestrowani
Postów: 314
Pomógł: 44
Dołączył: 12.11.2010
Skąd: UK

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


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





Grupa: Zarejestrowani
Postów: 164
Pomógł: 3
Dołączył: 13.12.2007

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


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 ?
Go to the top of the page
+Quote Post
nekomata
post
Post #4





Grupa: Zarejestrowani
Postów: 314
Pomógł: 44
Dołączył: 12.11.2010
Skąd: UK

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


  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!
Go to the top of the page
+Quote Post
mortus
post
Post #5





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


@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?
Go to the top of the page
+Quote Post
nekomata
post
Post #6





Grupa: Zarejestrowani
Postów: 314
Pomógł: 44
Dołączył: 12.11.2010
Skąd: UK

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


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

Ten post edytował nekomata 17.11.2010, 09:58:01
Go to the top of the page
+Quote Post
kleszczoscisk
post
Post #7





Grupa: Zarejestrowani
Postów: 164
Pomógł: 3
Dołączył: 13.12.2007

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


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ść.
Go to the top of the page
+Quote Post
mortus
post
Post #8





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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





Grupa: Zarejestrowani
Postów: 164
Pomógł: 3
Dołączył: 13.12.2007

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


Dzięki serdeczne wszystkim za pomoc, @mortus: (IMG:http://files.chesscomfiles.com/images_users/tiny_mce/BorgQueen/sm_worship.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: 24.08.2025 - 10:37