UNION不想返回不同的值

时间:2012-10-18 23:42:26

标签: mysql full-text-search distinct union

我通过描述一些对象来编写全文搜索脚本。但我对布尔模式下的默认全文搜索算法不满意,所以我尝试以某种方式修改它。我想将3个搜索组合成一个。第一个查询我搜索“精确短语”,第二个 - 短语的所有单词,第三个 - 至少有一个单词存在。然后按优先级返回。我必须做这样的事情:

SELECT
    description,
    MATCH(description) AGAINST ('"my search"' in boolean mode) FROM search
    WHERE MATCH(description) AGAINST ('"my search"' in boolean mode)

UNION DISTINCT

SELECT
    description,
    MATCH(description) AGAINST ('+my +search' in boolean mode) FROM search
    WHERE MATCH(description) AGAINST ('+my +search' in boolean mode)

UNION

SELECT
    description,
    MATCH(description) AGAINST ('my* search*' in boolean mode) FROM search
    WHERE MATCH(description) AGAINST ('my* search*' in boolean mode)

如您所见,第一行行将包含最相关的结果 - 精确短语。第二个块将包含较少的相关行,第三个块将包含所有其余的行。

但是这个查询返回重复的行,换句话说,第一个块中存在的行,可以在第二个块中重复,或者第三个,即使我使用UNION DISTINCT。但是我想为所有三个子选择获得全局不同的行集。如果行出现在第一个块中,则它必须不存在于秒和第三个块中。我怎样才能做到这一点?或者你可以为这种搜索提供更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:0)

确定重新阅读问题。联盟都会给你所有的结果,工会应该给你明显的结果

或者你可以使用

`Select distinct * from 
(SELECT
    description,
    MATCH(description) AGAINST ('"my search"' in boolean mode) FROM search
    WHERE MATCH(description) AGAINST ('"my search"' in boolean mode)

UNION DISTINCT

SELECT
    description,
    MATCH(description) AGAINST ('+my +search' in boolean mode) FROM search
    WHERE MATCH(description) AGAINST ('+my +search' in boolean mode)

UNION

SELECT
    description,
    MATCH(description) AGAINST ('my* search*' in boolean mode) FROM search
    WHERE MATCH(description) AGAINST ('my* search*' in boolean mode)) B`
相关问题