2014-12-04 5 views
0

У меня есть таблица ингредиентов в моем db. Я хочу получить тот рецепт, который содержит некоторые ингредиенты и не содержит ингредиентов.Полнотекстовый поиск mysql

Например, у меня есть 2 рецепта, которые содержат «pav», но один из них не содержит «phudina». Теперь ниже приведены данные таблицы db.

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  

Теперь я хочу, чтобы этот рецепт идентификаторов, который содержит «пав», но не «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 

В чем проблема с запросом?

+0

Почему вы используете полнотекстовый поиск по столбцу, содержащему только одно слово? – Barmar

ответ

1

Вы тестируете оба условия для каждой строки, не глядя на другие строки с тем же rcteID. Это будет работать, если у вас есть все ингредиенты в одной строке, но это не работает, когда вы нормализуете таблицу, как есть. Используйте:

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

DEMO

Там также, кажется, не будет необходимости в использовании полнотекстового поиска, когда ingredient столбец только одно слово. Но вы можете заменить условие = на MATCH, если вам это действительно нужно (возможно, фактические данные не похожи на примеры).

Смежные вопросы