PHP / MySQL排序项首先如果“word”存在,那么其余的ASC?

时间:2012-05-02 00:50:33

标签: php mysql

我有一个食物数据库,我正在尝试实施一个简单的搜索,将首先放置“原始”或“最少处理”的项目。

例如,当我在寻找“胡萝卜”时,我真的不想整理所有加工食品(胡萝卜蛋糕等),快餐(Wendy's carrot big mac等)。我想要的第一件物品是“胡萝卜,生的”,“胡萝卜,煮熟的”,“胡萝卜冷冻”,“胡萝卜,罐头”等。

有没有办法在MYSQL中执行此操作,以便我首先按“关键字的存在”对项目进行排序(让我们说:“原始”,“新鲜”,“煮沸”,“冻结”......)然后之后的所有其他事件?

注意:

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

非常感谢!

乔尔

3 个答案:

答案 0 :(得分:3)

这可能对您有用:

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

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

答案 1 :(得分:1)

自然单词搜索根据相关性按顺序返回记录,因此如果您在foods.title列中添加了FULLTEXT索引,则只需执行如下搜索:

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

额外的LIKE标准过滤掉了开头没有单词“carrot”的结果,如“fish,canned”。

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

答案 2 :(得分:0)

如果处理食物,为什么没有和称为“已处理”的附加字段存储1。然后按处理和名称排序。