2011-07-24 60 views
1

具有以下表模式:搜索多列

id | english_name | russian_name | year 
--------------------------------------- 
5 | The Book | Kniga  | 2008 

和给定的输入:Kniga 2008;

是否可以重现以下步骤?

  • 搜索russian_name用于确切匹配。如果匹配,则返回该行;
  • 如果不匹配,请搜索english_name进行精确匹配。
  • 如果仍然没有匹配,如下面的情况(输入是Kniga 2008),则尝试在列之间查找并查看是否存在任何匹配列的组合。在这种特殊情况下,russian_nameyear将匹配。
  • 忽略类似的字符-/:因此,如果给定的输入是:The Book/Kniga 2008或是The Book : 2008,结果应该仍然包含上面行。

回答

2

这不是很漂亮,但:

SELECT * FROM books WHERE russian_name = ? OR english_name = ? OR CONCAT(russian_name, ' ', year) LIKE ? OR CONCAT(english_name, ' ', year) LIKE ? 

在查询字符串设定为前两个问号,而第二和第三为:

'%' . str_replace (' ', '%', $query) . '%'