Posiadam 3 tabele, które muszą ze sobą współpracować:
-- -- Struktura tabeli dla `funtests` -- CREATE TABLE `funtests` ( `funtest_id` int(11) NOT NULL AUTO_INCREMENT, `funtest_owner` int(11) NOT NULL, `funtest_title` varchar(255) NOT NULL, `funtest_rewrite` varchar(255) NOT NULL, `funtest_main` enum('y','n') NOT NULL DEFAULT 'n', `funtest_time` int(11) NOT NULL, PRIMARY KEY (`funtest_id`), KEY `funtest_owner` (`funtest_owner`), KEY `funtest_rewrite` (`funtest_rewrite`), KEY `funtest_time` (`funtest_time`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; -- -------------------------------------------------------- -- -- Struktura tabeli dla `funtests_answers` -- CREATE TABLE `funtests_answers` ( `answer_id` int(11) NOT NULL AUTO_INCREMENT, `answer_funtest` int(11) NOT NULL, `answer_question` int(11) NOT NULL, `answer_points` int(11) NOT NULL DEFAULT '0', `answer_text` varchar(255) NOT NULL, PRIMARY KEY (`answer_id`), KEY `answer_funtest` (`answer_funtest`), KEY `answer_question` (`answer_question`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ; -- -------------------------------------------------------- -- -- Struktura tabeli dla `funtests_questions` -- CREATE TABLE `funtests_questions` ( `question_id` int(11) NOT NULL AUTO_INCREMENT, `question_funtest` int(11) NOT NULL, `question_question` varchar(255) NOT NULL, `question_tip` varchar(255) NOT NULL, PRIMARY KEY (`question_id`), KEY `item_question` (`question_question`) ) 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:
SELECT * FROM funtests_answers LEFT JOIN funtests_questions ON (answer_question = question_id) LEFT JOIN funtests ON (question_funtest = funtest_id) WHERE funtest_owner = 8;