snippetsqlMinor
Query: How to get both Question and multi Answers in one query
Viewed 0 times
multianswersquerybothonegethowandquestion
Problem
For this question,
In one query, I want to get one question and all answers of this question by QuestionID:
-
How to write a query like that
-
In case that, I "think" will have each rows is an answer with additional fields of question. This will make duplication because all those answers have same question content --> cost memory to store additional data. So compare to this: get QuestionID and query get Question. get QuestionID and query to get all Answers. Does this way lost performance than first approach but gain more memory ?
Here is my script:
Thanks :)
Question and Answer are just my example tables for one-many relationship. For example: Question(QuestionID, QuestionTitle, QuestionContent) and Answer(AnswerID, AnswerContent, QuestionID)In one query, I want to get one question and all answers of this question by QuestionID:
-
How to write a query like that
-
In case that, I "think" will have each rows is an answer with additional fields of question. This will make duplication because all those answers have same question content --> cost memory to store additional data. So compare to this: get QuestionID and query get Question. get QuestionID and query to get all Answers. Does this way lost performance than first approach but gain more memory ?
Here is my script:
DROP TABLE IF EXISTS `Question` ;
CREATE TABLE IF NOT EXISTS `Question` (
`QuestionID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`QuestionContent` VARCHAR(200) NOT NULL,
PRIMARY KEY (`QuestionID`),
ENGINE = InnoDB;
DROP TABLE IF EXISTS `Answer` ;
CREATE TABLE IF NOT EXISTS `Answer` (
`AnswerID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`QuestionID` INT UNSIGNED NOT NULL,
`ReplyContent` VARCHAR(200) NOT NULL,
PRIMARY KEY (`AnswerID`),
INDEX `fk_Answer_Question1_idx` (`QuestionID` ASC),
CONSTRAINT `fk_Answer_Question1`
FOREIGN KEY (`QuestionID`)
REFERENCES `Question` (`QuestionID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
ENGINE = InnoDB;Thanks :)
Solution
You could make it with a simple
With your actual design the query would be like:
Related:
JOIN, the question is: Are you going to have others tables?. That could make that you have to redo your design. I suggest EAV if you're going to use more tables with some configuration between Questions and Answers. With your actual design the query would be like:
mysql> SELECT
-> q.QuestionID,
-> q.QuestionContent,
-> a.AnswerID,
-> a.ReplyContent
-> FROM test.Question AS q
-> JOIN test.Answer AS a ON (a.QuestionID=q.QuestionID)
-> WHERE q.QuestionID=1;
+------------+------------------------------+----------+--------------+
| QuestionID | QuestionContent | AnswerID | ReplyContent |
+------------+------------------------------+----------+--------------+
| 1 | How many indexes may I have? | 1 | Use 6 |
| 1 | How many indexes may I have? | 2 | Use 1 |
| 1 | How many indexes may I have? | 3 | A or B |
+------------+------------------------------+----------+--------------+
3 rows in set (0.00 sec)
mysql> EXPLAIN SELECT
-> q.QuestionID,
-> q.QuestionContent,
-> a.AnswerID,
-> a.ReplyContent
-> FROM test.Question AS q
-> JOIN test.Answer AS a ON (a.QuestionID=q.QuestionID)
-> WHERE q.QuestionID=1;
+----+-------------+-------+-------+-------------------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+-------------------------+---------+---------+-------+------+-------------+
| 1 | SIMPLE | q | const | PRIMARY | PRIMARY | 4 | const | 1 | |
| 1 | SIMPLE | a | ALL | fk_Answer_Question1_idx | NULL | NULL | NULL | 3 | Using where |
+----+-------------+-------+-------+-------------------------+---------+---------+-------+------+-------------+
2 rows in set (0.00 sec)
mysql>Related:
- To EAV or not to EAV?
- Efficient query for an advanced EAV model
- Eav MySQL Search
Code Snippets
mysql> SELECT
-> q.QuestionID,
-> q.QuestionContent,
-> a.AnswerID,
-> a.ReplyContent
-> FROM test.Question AS q
-> JOIN test.Answer AS a ON (a.QuestionID=q.QuestionID)
-> WHERE q.QuestionID=1;
+------------+------------------------------+----------+--------------+
| QuestionID | QuestionContent | AnswerID | ReplyContent |
+------------+------------------------------+----------+--------------+
| 1 | How many indexes may I have? | 1 | Use 6 |
| 1 | How many indexes may I have? | 2 | Use 1 |
| 1 | How many indexes may I have? | 3 | A or B |
+------------+------------------------------+----------+--------------+
3 rows in set (0.00 sec)
mysql> EXPLAIN SELECT
-> q.QuestionID,
-> q.QuestionContent,
-> a.AnswerID,
-> a.ReplyContent
-> FROM test.Question AS q
-> JOIN test.Answer AS a ON (a.QuestionID=q.QuestionID)
-> WHERE q.QuestionID=1;
+----+-------------+-------+-------+-------------------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+-------------------------+---------+---------+-------+------+-------------+
| 1 | SIMPLE | q | const | PRIMARY | PRIMARY | 4 | const | 1 | |
| 1 | SIMPLE | a | ALL | fk_Answer_Question1_idx | NULL | NULL | NULL | 3 | Using where |
+----+-------------+-------+-------+-------------------------+---------+---------+-------+------+-------------+
2 rows in set (0.00 sec)
mysql>Context
StackExchange Database Administrators Q#107250, answer score: 2
Revisions (0)
No revisions yet.