MySQL全文搜索与查询匹配AND OR列1 = ABC

时间:2016-08-04 14:30:41

标签: mysql full-text-search

这有效;

SELECT MATCH('Col1', 'Col2') AGAINST('search query') AS Score, Col1, Col2, Col3 
FROM my_table 
WHERE 
Col1 = 'something-1' 
OR 
Col2 = 'something-2' 
OR 
MATCH('Col1', 'Col2') AGAINST ('search query') HAVING Score > 2;

这不;

SELECT MATCH('Col1', 'Col2') AGAINST('search query') AS Score, Col1, Col2, Col3 
FROM my_table 
WHERE 
Col1 = 'something-1' 
OR 
Col2 = 'something-2' 
OR 
MATCH('Col1', 'Col2') AGAINST ('search query') HAVING Score > 2 
AND Col3 = 'something3';

我不确定这是否会带回我想要的确切结果,虽然这是主要问题:如何使用AND与Match匹配,最重要的是,使用(括号)将事物有效地链接在一起以优先考虑正确的混合物;

(X = 1 OR Y = 2 OR MATCH('Col1', 'Col2') AGAINST ('search query') HAVING Score > 2) AND Z = 3

到目前为止,从我对每个组合的测试中,我都没有设法让它有效地发挥作用。我正在尝试扩展当前复杂的查询,该查询仅使用AND和OR当前还包括MATCH AGAINST具有一定质量的信息。

必须有一个正确的方法来做到这一点,我做得不好。

更新1 有趣的是,当我实现建议的查询并首先使用AND语句时,如下所示;

Col3 = 'something3' AND
(
    Col1 = 'something-1' 
    OR 
    Col2 = 'something-2' 
    OR 
    MATCH('Col1', 'Col2') AGAINST ('search query')  > 2 
);

然后这实际上返回重复的结果。

2 个答案:

答案 0 :(得分:1)

似乎你只需要

<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>

<div class="col-md-12 col-sm-12 col-xs-12">
    <div class="col-md-4 col-sm-4 col-xs-4">
        <select class="form-control">
            <option>Option 1</option>
            <option>Option 2</option>
            <option>Option 3</option>
            <option>Option 4</option>
        </select>
    </div>
    <div class="col-md-4 col-sm-4 col-xs-4">
        <input type="text" name="" class="form-control">
    </div>
    <div class="col-md-4 col-sm-4 col-xs-4">
        <button class="btn btn-default"><span class="glyphicon glyphicon-plus"></span></button>
    </div>
</div>

答案 1 :(得分:0)

@Arilia提供的代码完美无缺。主要提示自己(以及其他人如果你遇到类似问题偶然发现)当构建复杂查询时,请记住在计算MySQL全文搜索生成的分数时,这不会适用于结果中的每一行设置,有些将显示0,因为它们不会被查询的这一部分触发,它们将由查询的其他更简单的部分触发。小学生错误。

SELECT MATCH('Col1', 'Col2') AGAINST('search query') AS Score, Col1, Col2, Col3 
FROM my_table 
WHERE 
(
    Col1 = 'something-1' 
    OR 
    Col2 = 'something-2' 
    OR 
    MATCH('Col1', 'Col2') AGAINST ('search query')  > 2 
)
AND
Col3 = 'something3';