获得 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?' |
+----------+----------------------------------------+------------------------+------------------+