0

我的表架构如下所示:

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?

4

1 回答 1

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%'

我认为第一个更干净,因为它为帖子返回一行,为每个响应返回一行。第二种更容易实现为查询,但其结果更难处理,并且会导致数据库和脚本之间的流量增加,这是一种浪费,尤其是在您有单独的数据库服务器的情况下。

于 2012-11-30T00:45:23.570 回答