MySQL - 连接同一张表的数据

3

我有一个存储所有评论的表格。一些评论是问题,另一些则是答案。 因此,我的表格看起来像这样:

id  parent_id   message is_answer   answered
1   0           2x2     0           1
2   1           4       1           0
3   0           5x9     0           0
4   1           2x9     0           0
5   1           2x8     0           1
6   5           16      1           0

因此,我希望得到以下这个表格:

q_id    q_message   q_answer 
1       2x2         4
3       5x9         NULL 
4       2x9         NULL
5       2x8         16

因此,我想获取所有问题及其答案(如果存在)。

2个回答

5

没有任何东西会阻止您将表格与其自身连接。

SELECT q.id AS q_id, q.message AS q_message, a.message AS q_answer
FROM table AS q
LEFT JOIN table AS a ON a.parent_id = q.id
WHERE q.is_answer = 0;

请注意,这并不能完全给出你想要的输出结果...因为它显示了所有问题的答案:
+------+-----------+----------+
| q_id | q_message | q_answer |
+------+-----------+----------+
|    1 | 2x2       | 4        | 
|    1 | 2x2       | 2x9      | 
|    1 | 2x2       | 2x8      | 
|    3 | 5x9       | NULL     | 
|    4 | 2x9       | NULL     | 
|    5 | 2x8       | 16       | 
+------+-----------+----------+
6 rows in set (0.00 sec)

您请求的输出仅显示问题1的答案“4”。我不确定这是否是您有意为之的,如果是,您需要一些额外的GROUP BY或其他逻辑来过滤掉您不想显示的答案。


2

尚未测试,但这应该能解决问题:

select   q.id as q_id,q.message as q_message ,a.message as q_answer   FROM comments q LEFT OUTER JOIN comments a ON (a.parent_id = q.id and a.is_answer=1 and q.is_answer=0)

我认为你的表设计可以不用is_answer列,如果是问题,你只需将parent_id设置为NULL即可。


谢谢!在ON()中添加a.is_answer=1就解决了问题!如果没有这个条件,连接只会返回有答案的行。你能解释一下吗? :) - the_ghost
这个答案在输出中包含了所有的答案作为问题。显然这不是预期的结果。 - Jonathan Hall
我认为造成这个的不是a.is_answer=1,而是左外连接(LEFT OUTER JOIN)的原因。 - Gryphius
...而flimzy是正确的,应该有一个额外的q.is_answer = 0。 - Gryphius
关键字“OUTER”在该查询中没有任何区别(如果我没记错的话,在任何查询中都是默认值)。 - Jonathan Hall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接