我有一个名为的表users
,其中包含列firstname
和lastname
.
我正在努力研究如何构造 WHERE 子句以返回匹配的名字、姓氏、名字加上空格和姓氏以及姓氏加上逗号和名字的结果。例如,“John”、“Doe”、“John Doe”和“Doe, John”。它也应该适用于部分补丁(即“John D”)。我正在考虑类似以下的内容(用搜索短语替换 ? )。
SELECT * FROM people WHERE
firstname LIKE ?
OR CONCAT_WS(" ",firstname,lastname) LIKE ?
OR lastname LIKE ?
OR CONCAT_WS(", ",lastname,firstname) LIKE ?
这种方法有一个小缺陷,因为搜索“John Doe”也会返回“John Enders”、“John Flaggens”和“John Goodmen”,所以我需要添加一些条件来在第一个和当两者都给出时,姓氏匹配。
这种方法还有一个很大的缺陷,因为我的 WHERE 子句中有一些函数可以防止使用索引并导致性能显着降低。
我可以只使用 SQL 有效地做到这一点,而无需在 WHERE 子句中使用函数,还是应该使用服务器代码(即 PHP)来解析给定的搜索短语中的空格和逗号并根据结果创建动态 SQL 查询?