以最易理解和简单的方式获取 OP 所要求的确切结果的方法是将问题分成多个子查询,而不是一个单一的查询。
我创建了许多中间 VIEW
来获取最终结果。使用中间 VIEW
而不是中间 TABLE
的好处在于原始表中的任何更新也会导致 VIEW
中结果的更新。
子查询 1:
CREATE VIEW q AS
-> SELECT userid,
-> GROUP_CONCAT(text ORDER BY userid SEPARATOR ", ") AS questions
-> FROM Questions
-> GROUP BY userid;
SELECT * FROM q;
+
| userid | questions |
+
| 1 | 'How are you?', 'Whats going on here?' |
| 2 | 'Good and you?' |
+
子查询2:
CREATE VIEW q1 AS
-> SELECT userid, text AS questions1
-> FROM Questions
-> WHERE pageno = 1;
SELECT * FROM q1;
+
| userid | questions1 |
+
| 1 | 'Whats going on here?' |
+
子查询3:
CREATE VIEW q2 AS
-> SELECT userid, text AS questions2
-> FROM Questions
-> WHERE pageno = 2;
SELECT * FROM q2;
+
| userid | questions2 |
+
| 1 | 'How are you?' |
| 2 | 'Good and you?' |
+
子查询 4:
CREATE VIEW ql AS
-> SELECT u.id, q.questions
-> FROM Users AS u
-> LEFT OUTER JOIN
-> q ON u.id = q.userid;
SELECT * FROM ql;
+
| id | questions |
+
| 1 | 'How are you?', 'Whats going on here?' |
| 2 | 'Good and you?' |
+
子查询 5:
CREATE VIEW q1l AS
-> SELECT u.id, q1.questions1
-> FROM Users AS u
-> LEFT OUTER JOIN
-> q1 ON u.id = q1.userid;
SELECT * FROM q1l;
+
| id | questions1 |
+
| 1 | 'Whats going on here?' |
| 2 | NULL |
+
子查询 6:
CREATE VIEW q2l AS
-> SELECT u.id, q2.questions2
-> FROM Users AS u
-> LEFT OUTER JOIN
-> q2 ON u.id = q2.userid;
SELECT * FROM q2l;
+
| id | questions2 |
+
| 1 | 'How are you?' |
| 2 | 'Good and you?' |
+
子查询 7:
CREATE VIEW vt AS
-> SELECT u.name,
-> ql.questions,
-> q1l.questions1,
-> q2l.questions2
-> FROM
-> Users AS u
-> INNER JOIN
-> ql ON u.id = ql.id
-> INNER JOIN
-> q1l ON ql.id = q1l.id
-> INNER JOIN
-> q2l ON q1l.id = q2l.id;
SELECT * FROM vt;
+
| name | questions | questions1 | questions2 |
+
| Jim | 'How are you?', 'Whats going on here?' | 'Whats going on here?' | 'How are you?' |
| Joe | 'Good and you?' | NULL | 'Good and you?' |
+
最终查询:
CREATE VIEW v AS
-> SELECT name AS username,
-> COALESCE(questions, "") AS questions,
-> COALESCE(questions1, "") AS "Questions Page 1",
-> COALESCE(questions2, "") AS "Questions Page 2"
-> FROM vt;
SELECT * FROM v;
+
| username | questions | Questions Page 1 | Questions Page 2 |
+
| Jim | 'How are you?', 'Whats going on here?' | 'Whats going on here?' | 'How are you?' |
| Joe | 'Good and you?' | | 'Good and you?' |
+