我有一个遗留的类似于票务系统的简化数据库表结构,如下所示:
在列表中,我展示了所有的消息。当点击一条消息时,我会显示它的答案等等。
问题是,现在我需要制作一个包含此消息的所有父元素和子元素的列表结构,以及该消息在树形结构中的位置。如何从数据库中检索这些信息?
我正在使用Laravel,但原始SQL也可以帮助我找到方向。
例子:
消息历史:
- 嗨,我有一个问题
- 问题仍然存在
- 没关系,我解决了
- 问题又回来了
- 又是同样的问题
我只能想到循环和多个SQL查询执行,对于每个父级和子级,这看起来像是代码异味。
messages
id INT
parent_id INT
content TEXT
answer TEXT
...
在列表中,我展示了所有的消息。当点击一条消息时,我会显示它的答案等等。
问题是,现在我需要制作一个包含此消息的所有父元素和子元素的列表结构,以及该消息在树形结构中的位置。如何从数据库中检索这些信息?
我正在使用Laravel,但原始SQL也可以帮助我找到方向。
例子:
╔════╦═══════════╦════════════════════════╦═════════════════╗ ║ id ║ parent_id ║ content ║ answer ║ ╠════╬═══════════╬════════════════════════╬═════════════════╣ ║ 1 ║ NULL ║ 嗨,我有一个问题 ║ 我无法帮助你 ║ ║ 2 ║ 1 ║ 问题仍然存在 ║ 好的,是什么问题?║ ║ 3 ║ 2 ║ 没事了,我解决了 ║ 哦,那好吧。 ║ ║ 4 ║ 3 ║ 问题又出现了 ║ 是哪个问题? ║ ║ 5 ║ 4 ║ 又是同样的问题 ║ ... ║ ╚════╩═══════════╩════════════════════════╩═════════════════╝当显示
id = 4
的消息时,我应该能够显示类似以下列表的内容:消息历史:
- 嗨,我有一个问题
- 问题仍然存在
- 没关系,我解决了
- 问题又回来了
- 又是同样的问题
我只能想到循环和多个SQL查询执行,对于每个父级和子级,这看起来像是代码异味。
更新
正如Daan所说,这个问题看起来像是如何创建一个MySQL分层递归查询的重复。
然而,我决定不删除它,因为Ravan刚刚用Laravel方法回答了它,帮助我解决了问题,所以我将把它留在这里供日后参考。