我的表架构如下所示:
table posts (id integer (primary key), parentid integer, tags varchar, ...)
对于任何帖子,它是一个帖子中的第一个帖子,它们的parentid为NULL,标签等于一个字符串。 任何其他帖子不是一个帖子中的第一篇帖子,他们的parentid是该帖子中第一篇帖子的id,标签是NULL。
我可以通过
查询特定主题的所有“第一篇帖子”SELECT * FROM posts WHERE tags LIKE '%topic%';
但是如何查询所有帖子,包括特定主题的回复?
假设我有这样的记录
id parentid tags
--------------------
123 null topic
222 123 null
223 123 null
444 null topic
555 null hello
如何让所有ID讨论主题,分别是123,222,223,444?
答案 0 :(得分:3)
SELECT * FROM posts
WHERE tags LIKE '%topic%'
UNION ALL
SELECT * FROM posts
WHERE PARENTID IN
(SELECT ID FROM POSTS WHERE tags LIKE '%topic%')
或
SELECT p.*, r.* FROM posts p
LEFT JOIN posts r ON r.ID = p.ID
WHERE p.tags LIKE '%topic%'
我认为第一个是更干净的,因为它为帖子返回一行,为每个响应返回一行。第二个更容易实现作为查询,但其结果更难处理,并导致数据库和脚本之间的流量更多,这是一种浪费,特别是如果你有一个单独的数据库服务器。