【问题标题】:Sql for varying where condition用于改变 where 条件的 Sql
【发布时间】:2011-05-07 11:08:09
【问题描述】:

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

【问题讨论】:

  • 此时你的表结构是什么?

标签: php mysql sql codeigniter


【解决方案1】:

最简单的解决方案(不是最好的,恕我直言,但最简单的解决方案之一)是利用 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

【讨论】:

    【解决方案2】:

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

    如何保存成分?我希望在一个关系表中(recipe_id、component_id、amount)?这样更容易搜索。

    【讨论】:

      猜你喜欢
      • 2014-09-30
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多