我有一个父类别和子类别的结果集。如果结果中存在子类别,我想排除所有父类别。
我要做的是在查询中使用
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)
,但这只会产生相同的输出。
有什么方法可以仅使用结果集来完成此任务吗?
您可以尝试这样的查询:
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;