我的数据库中有成分表。我想拿那些含有一些成分而不含一些成分的食谱。
例如,我有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
查询有什么问题?
答案 0 :(得分:1)
您正在针对每一行测试这两个条件,而不是查看具有相同rcteID
的其他行。如果您将所有成分都放在一个字符串中,那将会有效,但是当您按照规范对表进行规范化时,它并不起作用。使用此:
SELECT ingredientID, rcteID
FROM ingredient
WHERE ingredient = 'pav'
AND rcteID NOT IN (
SELECT rcteID
FROM ingredient
WHERE ingredient = 'phudina'
)
当ingredient
列只是一个单词时,似乎还不需要使用全文搜索。但是,如果您真的需要,可以将=
条件替换为MATCH
(可能实际数据不像示例)。