mysql - 如何过滤搜索属于已删除帖子的答案?

标签 mysql sql

我有一个这样的表:

// 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

如上表所示,answer2question3 都被删除了。所以我想在搜索中过滤它们。重点是,我也想过滤 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/

相关文章:

PHP插入Mysql失败(自增)

mysql - 为什么我不能在 MySQL 中使用 ">"比较日期?

mysql - VB.NET SQL 数据库登录

mysql - MySQL中如何使用触发事件来防止某个用户被删除

sql - 如何更新日期类型列?

mysql - 查询优化以查找随机样本

python - 不可 JSON 序列化 - Python + Flask + Sqlalchemy

mysql - 月和年的范围查询

php - 根据 AUTO_INCREMENT(唯一键)更改现有行 ID

mysql - SQL- LOAD DATA INFILE + REPLACE 不起作用(第 1 行不包含所有列的数据)