我有一张这样的table:
// 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;
如您所见,它只过滤删除的帖子。它不关心过滤属于已删除问题的答案。
3条答案
按热度按时间gywdnpxw1#
问题和答案可能分在不同的表格里;这样你就不会有这个问题了。在这种情况下,您可能会在一对多关系中使用一个简单的连接。你可以用CTE来模拟:
如果答案显示为自己的行是绝对必要的:
我只是意识到你使用的是mysql,所以你可能没有可用的cte和/或分析函数。希望这对你还是有用的。
6l7fqoea2#
你可以再加一个
AND
运算符使用相关子查询Assert已删除父项的存在,并修改您的条件以获得更优化的查询:lmvvr0a83#
如果只有一级关系——对于任何一行r,存在另一行r',那么r'
.related
=r.id
,右。related IS NULL
--你可以把问题和答案连接起来,然后检查问题的答案deleted
或者使用NOT EXISTS
检查是否不存在已删除的父记录。LEFT JOIN
变体: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;