2

我有一个食品数据库,我正在尝试实现一个简单的搜索,该搜索将放置“原始”或“最少加工”的第一个项目。

例如,当我搜索“胡萝卜”时,我真的不想将所有加工食品(胡萝卜蛋糕等)、快餐(温迪的胡萝卜巨无霸等)都分类。我希望第一个项目是“胡萝卜,生的”,“胡萝卜,煮的”,“胡萝卜冷冻”,“胡萝卜,罐头”等。

有没有办法在 MYSQL 中做到这一点,以便我首先按“关键字的存在”对我的项目进行排序(比如说:“raw”、“fresh”、“boiled”、“frozen”......)然后所有其他出现后?

笔记 :

  • 关键字可能存在也可能不存在
  • 关键字可能在任何地方
  • 我还必须单独找到搜索关键字,在此示例中为“carrot”,以便“carrot cake”仍在我的结果中。

非常感谢!

乔尔

4

3 回答 3

3

这可能对您有用:

SELECT * FROM foods
WHERE foods.title LIKE '%carrot%'
ORDER BY foods.title LIKE '%raw%' DESC, foods.title

原因DESC是它会返回 0 或 1,并且您希望首先对返回 1 的结果进行排序。

于 2012-05-02T00:55:04.987 回答
1

自然词搜索会根据相关性按顺序返回记录,因此如果您将 FULLTEXT 索引添加到 foods.title 列,您可以简单地执行如下搜索:

SELECT *
FROM foods
WHERE MATCH (title) AGAINST ('carrot raw fresh frozen canned')
  AND title LIKE 'carrot%'

附加的 LIKE 标准会过滤掉开头没有单词胡萝卜的结果,例如“鱼,罐头”。

FULLTEXT 索引目前只能与 MyISAM 表一起使用,不过很快(v5.6+)您也可以将它们与 InnoDB 一起使用。

于 2012-05-02T01:51:56.767 回答
0

如果食物经过加工,为什么不设置一个名为“已加工”的附加字段来存储 1。然后只需按已处理和名称排序。

于 2012-05-02T01:06:37.030 回答