我有一个这样的表:
// questions_and_answers
+----+---------------+------------------------+---------+---------+
| id | subject | body | related | deleted |
+----+---------------+------------------------+---------+---------+
| 1 | subject1 | question1 | NULL | 0 |
| 2 | | answer1 | 1 | 0 |
| 3 | subject2 | question2 | NULL | 0 |
| 4 | | answer2 | 3 | 1 |
| 5 | | answer3 | 3 | 0 |
| 6 | subject3 | question3 | NULL | 1 |
| 7 | | answer4 | 6 | 0 |
+----+---------------+------------------------+---------+---------+
-- related column contains either NULL for questions or the id of its question for answers
如上表所示,answer2
和 question3
都被删除了。所以我想在搜索中过滤它们。重点是,我也想过滤 answer4
。因为它属于删除的问题(question3
)。知道如何进行此类过滤吗?
这是我当前的查询:
SELECT qa.*
FROM questions_and_answers AS qa
WHERE MATCH(subject,body) AGAINST (:entry)
AND deleted = 0
ORDER BY id DESC
LIMIT :page, 10;
如您所见,它只过滤已删除的帖子。它不关心过滤属于已删除问题的答案。
最佳答案
如果只有一个级别的关系——对于任何行r,另一行r'存在,那么r' .related
= r.id
, r.related IS NULL
-- 你可以将问题与答案左连接并检查问题的已删除
,或者使用NOT EXISTS
来检查是否不存在已删除的父记录。
LEFT JOIN
变体:
SELECT qa1.*
FROM questions_and_answers qa1
LEFT JOIN questions_and_answers qa2
ON qa2.id = qa1.related
WHERE MATCH(qa1.subject, qa1.body) AGAINST (:entry)
AND qa1.deleted = 0
AND coalesce(qa2.deleted, 0) = 0
ORDER BY qa1.id DESC
LIMIT :page, 10;
NOT EXISTS
变体:
SELECT qa1.*
FROM questions_and_answers qa1
WHERE MATCH(qa1.subject, qa1.body) AGAINST (:entry)
AND qa1.deleted = 0
AND NOT EXISTS (SELECT *
FROM questions_and_answers qa2
WHERE qa2.id = qa1.related
AND qa2.deleted = 1)
ORDER BY qa1.id DESC
LIMIT :page, 10;
关于mysql - 如何过滤搜索属于已删除帖子的答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50883162/