Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: SELECT 3 tabel w jednym zapytaniu?
Forum PHP.pl > Forum > Bazy danych > MySQL
Athlan
Witam.

Posiadam 3 tabele, które muszą ze sobą współpracować:

  1. --
  2. -- Struktura tabeli dla `funtests`
  3. --
  4.  
  5. CREATE TABLE `funtests` (
  6. `funtest_id` int(11) NOT NULL AUTO_INCREMENT,
  7. `funtest_owner` int(11) NOT NULL,
  8. `funtest_title` varchar(255) NOT NULL,
  9. `funtest_rewrite` varchar(255) NOT NULL,
  10. `funtest_main` enum('y','n') NOT NULL DEFAULT 'n',
  11. `funtest_time` int(11) NOT NULL,
  12. PRIMARY KEY (`funtest_id`),
  13. KEY `funtest_owner` (`funtest_owner`),
  14. KEY `funtest_rewrite` (`funtest_rewrite`),
  15. KEY `funtest_time` (`funtest_time`)
  16. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
  17.  
  18. -- --------------------------------------------------------
  19.  
  20. --
  21. -- Struktura tabeli dla `funtests_answers`
  22. --
  23.  
  24. CREATE TABLE `funtests_answers` (
  25. `answer_id` int(11) NOT NULL AUTO_INCREMENT,
  26. `answer_funtest` int(11) NOT NULL,
  27. `answer_question` int(11) NOT NULL,
  28. `answer_points` int(11) NOT NULL DEFAULT '0',
  29. `answer_text` varchar(255) NOT NULL,
  30. PRIMARY KEY (`answer_id`),
  31. KEY `answer_funtest` (`answer_funtest`),
  32. KEY `answer_question` (`answer_question`)
  33. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
  34.  
  35. -- --------------------------------------------------------
  36.  
  37. --
  38. -- Struktura tabeli dla `funtests_questions`
  39. --
  40.  
  41. CREATE TABLE `funtests_questions` (
  42. `question_id` int(11) NOT NULL AUTO_INCREMENT,
  43. `question_funtest` int(11) NOT NULL,
  44. `question_question` varchar(255) NOT NULL,
  45. `question_tip` varchar(255) NOT NULL,
  46. PRIMARY KEY (`question_id`),
  47. KEY `item_question` (`question_question`)
  48. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;


Jednym zapytaniem chciałbym pobrać listę funtestów (funtests), pytania do nich (funtests_questions) oraz odpowiedzi do pytań (funtests_answers). Jakby nie patrzeć jest to w pewien sposób relacja podkategorii.

Zawsze robiłem to tak, że do pól dopisywałem jeszcze jeden uchwyt relacjonujący, np do odpowiedzi na pytanie pola: answer_question (do jakiego pytania należy odpowiedź) oraz DODATKOWO answe
_funtest (do jakiego funtestu należy pytanie).

Kiedyś robiłem to 3 zapytaniami:
- pobieramy listę funtestow
- pobieramy listę pytań (w zależności od funtestów, w klausuli IN() )
- pobieramy listę odpowiedzi (w zależności od pytań, w klausuli IN() )
Powstają nam rozsypane arraye, które potem w odpowiedni sposób sobie łączyłem.

Czy jest możliwość załadowania wszystkich rzeczy 1 zapytaniem?

Ofc mam pomysł, aby załadować odpowiedzi i joinować do nich pytania a do pytań dane funtestu, ale dane funtesu powtarzałyby się w każdym rekordzie, a dane pytań często, tyle ile jest odpowiedzi:
  1. SELECT * FROM funtests_answers LEFT JOIN funtests_questions ON (answer_question = question_id)
  2. LEFT JOIN funtests ON (question_funtest = funtest_id)
  3. WHERE funtest_owner = 8;
Indeo
Wszystko da sie wyciągnąć jednym zapytaniem, ale zapytanie ze złączenia kilku tabel zwraca wynik będący mnożeniem macierzy reprezentujących poszczególne tabele. Kategoria może mieć 'n' pytań, a każde pytanie po 'k' odpowiedzi. Zatem dana kategoria zostanie łącznie wymieniona w 'n' x 'k' zwróconych rekordów.
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.