全文搜索查询mysql

时间:2014-12-04 10:12:22

标签: mysql sql full-text-search

我的数据库中有成分表。我想拿那些含有一些成分而不含一些成分的食谱。

例如,我有2个食谱,其中包含" pav"但其中一个不包含" phudina"。现在,下面是我的数据库表数据。

Here in table(ingredients) recipeID 24(rcteID) contains pav and phudina
-----------------------------------------------------------------------
 ingredientID   rcteID  ingredient
    319          24     phudina
    320          24     pav     

Here in table(ingredients) recipeID 23(rcteID) not contains phudina
-----------------------------------------------------------------------
 ingredientID   rcteID  ingredient
    316          23     test    
    317          23     pav     
    318          23     puri     

现在我想要那些包含" pav"但不是" phudina"所以,这里是23但我的查询给了我两个食谱。我在成分列上应用了全文索引。

Below is the query which I have written.

SELECT  `Ingredient`.`ingredientID`, `Ingredient`.`rcteID` 
FROM `bdrplus`.`ingredient` AS `Ingredient`   
WHERE NOT(MATCH(`Ingredient`.`ingredient`) AGAINST('+phudina' IN BOOLEAN MODE)) 
AND MATCH(`Ingredient`.`ingredient`) AGAINST('+pav' IN BOOLEAN MODE)  
GROUP BY `Ingredient`.`rcteID

    Output
    ----------------------------
        ingredientID    rcteID
             317         23
             320         24
   Expected
   -----------------------------
        ingredientID    rcteID
             317         23

查询有什么问题?

1 个答案:

答案 0 :(得分:1)

您正在针对每一行测试这两个条件,而不是查看具有相同rcteID的其他行。如果您将所有成分都放在一个字符串中,那将会有效,但是当您按照规范对表进行规范化时,它并不起作用。使用此:

SELECT ingredientID, rcteID
FROM ingredient
WHERE ingredient = 'pav'
AND rcteID NOT IN (
    SELECT rcteID
    FROM ingredient
    WHERE ingredient = 'phudina'
)

DEMO

ingredient列只是一个单词时,似乎还不需要使用全文搜索。但是,如果您真的需要,可以将=条件替换为MATCH(可能实际数据不像示例)。