【发布时间】:2013-02-10 05:27:50
【问题描述】:
所以我需要通过查看一个字段从 MySQL 表中选择数据,看看它是否有某个单词,并在动态生成的 where 子句中做很多其他事情。
在过去使用旧的 mysql 扩展时,我会这样做:
select [bunch of stuff] left join [bunch of stuff] where
`field` rlike "(?=.*word1)(?=.*word2)(?=.*word3)..."
and [more where..] order by [order stuff]
现在我当然使用 mysqli 和准备好的语句...
select [bunch of stuff] left join [bunch of stuff] where
match(`field`) against(?,?,?...)
and [more where..] order by [order stuff]
不幸的是,我有一个 InnoDB 表,这意味着我没有全文搜索,这会让我像这样将一些类似的语句链接在一起:
select [bunch of stuff] left join [bunch of stuff] where
`field` like concat("%",?,"%") or `field` like concat("%",?,"%") ...
and [more where..] order by [order stuff]
但这意味着它打破了我在这里的“和”链,需要在每个“或”中重复 [more where..]... 这一定是错误的,我一直在盯着这个太久了。
有什么想法吗?
【问题讨论】:
-
您可能有兴趣知道从 MySQL 5.6.4 开始提供 InnoDB 全文搜索...当然,前提是您能够升级服务器上的 MySQL 版本。跨度>
-
谢谢你,这是一件非常好的事情......我不认为我会升级,但无论如何都很高兴知道!
-
在这种情况下,我的下一个建议是 (1) 用括号将所有
`field` like语句括起来,这样您就可以在 WHERE 中添加其他 AND 条件,以及 (2) 放弃 CONCAT() 语句,您可以按此处所示完成:stackoverflow.com/a/1786656/560114 -
嗯,这就是我要找的......你应该写一个答案而不是评论;)关于 concat() 有什么问题?我使用的是 mysqli 而不是 PDO,这就是它变得丑陋的地方
-
啊好吧...用mysqli我不知道,也许你需要
concat。我会把我的评论变成答案,但我认为@Passerby 已经做得很好了。
标签: php mysqli innodb sql-like