排除列与另一列匹配而无需子查询的行

问题描述 投票:0回答:1

我有一个父类别和子类别的结果集。如果结果中存在子类别,我想排除所有父类别。

我要做的是在查询中使用

NOT IN
,但这需要一个与主查询相同的子查询。

由于我在后期使用匹配过滤器以及可能的其他过滤器,我觉得应该有一种更简单的方法来实现这一点。

完整结果的查询是这样的:

SELECT id,cat_name,cat_parent FROM transport
WHERE MATCH (cat_name) AGAINST ('car*' IN BOOLEAN MODE)

结果:

+-----+------------------+------------+
| id  | cat_name         | cat_parent |
+-----+------------------+------------+
| 297 | carnaval         | 289        |
| 350 | cars & boats | 0          |
| 351 | cars             | 350        |
+-----+------------------+------------+

我想排除父类别“汽车和船只”,因为结果中存在子类别“汽车”。 为了实现这一点,我使用

NOT IN
:

SELECT id,cat_name,cat_parent FROM transport
WHERE MATCH (cat_name) AGAINST ('car*' IN BOOLEAN MODE)
AND id NOT IN(
    SELECT cat_parent FROM transport
    WHERE MATCH (cat_name) AGAINST ('car*' IN BOOLEAN mode)
)

这很好用,但我不喜欢必须将查询复制到 NOT IN 中。即使使用带有 NOT IN 或 NOT EXISTS 的子查询,SO 上类似问题的所有答案都会导致相同的答案,但感觉很多余。

我尝试过

AND id != cat_parent
AND id NOT IN (cat_parent)
,但这只会产生相同的输出。

有什么方法可以仅使用结果集来完成此任务吗?

mysql select subquery notin
1个回答
0
投票

您可以尝试这样的查询:

SELECT t1.id, t1.cat_name, t1.cat_parent
FROM transport t1
LEFT JOIN transport t2
ON t1.id = t2.cat_parent AND MATCH(t2.cat_name) AGAINST('car*' IN BOOLEAN MODE)
WHERE MATCH(t1.cat_name) AGAINST('car*' IN BOOLEAN MODE)
AND t2.cat_parent IS NULL;
© www.soinside.com 2019 - 2024. All rights reserved.