Sql适用于各种条件

时间:2011-05-07 11:08:10

标签: php mysql sql codeigniter

我正在使用codeigniter开发一个配方网站(我使用mysql作为数据库)。用户可以输入 任何数量的成分。我需要搜索含有这些成分的食谱。即如果用户放入鸡蛋和西红柿,我需要搜索使用两者的食谱。食谱搜索结果应按所需的额外成分数量较少的顺序排序。由于成分的数量不同,如何编写sql查询?如何订购搜索结果? 知道如何去做吗?提前谢谢。

2 个答案:

答案 0 :(得分:2)

最简单的解决方案(不是最好的,恕我直言,但最容易之一)是利用MySQL的全文索引。你可以从阅读MySQL's documentation on fulltext index开始,它在制作一个小搜索引擎时非常有用。借用explanation from wikipedia

  

在全文搜索中,搜索引擎在尝试匹配用户提供的搜索词时检查每个存储文档中的所有单词。

因此,在我的建议中,您可以将此表格与此类似:

----------------------------------------
RECIPES
----------------------------------------
id          | int(11)      | PRIMARY KEY
title       | varchar(255) |
body        | mediumtext   |
ingredients | tinytext     | FULLTEXT

考虑:

  • 仅为ingredients字段添加全文索引。

  • 将成分存储在字段ingredients内,用空格分隔,不要使用逗号。

  • 将成分存储在两个位置,上面的ingredients字段仅供搜索。您可能最好使用另一个表来存储其他用例的成分列表。

  • 由于您使用的是全文索引,因此可以使用BOOLEAN MODE语法。如果您要搜索eggtomato使用+eggs +tomato的食谱,如果您要搜索包含egg但不包含tomato的食谱,请使用+egg -tomato。请参阅MySQL's manual for detailed explanation

同样,它可能不是最好的解决方案,但这是我能想到的第一件事,而且这当然很容易。

有几点需要注意:

  • 默认情况下,MySQL的全文引擎无法识别低于4个字符的单词,您可以对其进行更改。

  • 如果您不使用布尔模式,如果结果超过数据集的50%,则MySQL全文搜索将返回空。

  • 全文搜索会忽略停用词here's the list

答案 1 :(得分:0)

http://www.jarrodgoddard.com/web-development/advanced-web-site-search-with-sql这里有一篇关于如何使用MySQL查询来获取基于相关性的搜索结果的文章。通过一点点创造力,您可以通过按特定成分的数量对它们进行排序来增加相关性。

如何节省成分?在关系表中我希望(recipe_id,ingredient_id,amount)?这样可以更轻松地进行搜索。