Witam.
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;