如何使用LIKE在MySQL中以没有特定顺序的所有可能选择在5个不同字段中进行搜索
作者:互联网
我有一个包含5个字段的数据库,这些字段是:姓名,地址,身份证,城镇,街道
然后,我有了一个接受一个参数的PHP查询.在此参数中,您可以输入所需的任何字段,并且结果必须仍然准确.
例如,如果我在搜索框中输入john doe Skate street,您将获得所有名为John Doe的记录,它们都位于称为Skate Street的街道上.
另外,请注意,该名称按SURNAME NAME的顺序存储在一个字段中(我不能更改此名称,因为这是必须的,因此请不要告诉我更改它更好…我知道这一点:)).显然,我希望可以以任何顺序输入名称,无论是NAME SURNAME还是SURNAME NAME.
我的想法是首先附加前两个输入的参数作为名称.我将告诉我的客户,前两个参数必须是名称和姓氏或姓氏和名字.在名字之后,他可以按照他喜欢的顺序输入任何顺序属性,即
这些将被接受:
name surname idcard town street
surname name idcard town street
name surname town idcard street
surname name address street idcard
这些将不被接受:
idcard town name surname street
town name surname idcard
出于简单的原因,我们将使查询复杂化太多(由于名称/姓氏原因,并且它们位于同一字段中)
如果有一种方法可以在没有很多复杂性的情况下实现后者,那么我也想听听.
我希望在这个问题上有所帮助
提前谢谢了
解决方法:
您似乎要进行的搜索并不是MySQL等RDBMS的最佳选择.而且,除非是一个相当具体的域,否则指定允许的搜索格式通常不利于可用性.
保持非常通用,用于在三个字段中搜索“ Persons Name Fake Street”的查询可能是这样的:
SELECT * FROM Users
WHERE (FirstName LIKE "%Persons%"
OR LastName LIKE "%Persons%"
OR Address LIKE "%Persons%")
AND (FirstName LIKE "%Name%"
OR LastName LIKE "%Name%"
OR Address LIKE "%Name%")
AND (FirstName LIKE "%Fake%"
OR LastName LIKE "%Fake%"
OR Address LIKE "%Fake%")
AND (FirstName LIKE "%Street%"
OR LastName LIKE "%Street%"
OR Address LIKE "%Street%")
这将找到具有与给定详细信息匹配的详细信息的任何成员.但是它不是很优雅,只会随着更长的查询和更多的字段而变得更糟.它的效率也难以置信,随着表的增加,它会很快挣扎-它无法使用索引.这也无助于您将“最佳”比赛放在顶部(如果有大量结果)
更好的解决方案可能是通过创建一个单独的表来使用MySQL全文索引,该表可以使用全文索引进行搜索以找到相关的用户.我对这种解决方案了解不多.
另一种选择是使用外部索引工具,如Lucene.尽管增加了更多的复杂性,但它允许额外的功能,例如字段加权.因此,例如,名称可能比地址更重要.这也可以按照相关性对结果进行排序.
正确的解决方案取决于您的要求(一如既往),但这是一些值得研究的想法.
标签:search,sql-like,sql,mysql 来源: https://codeday.me/bug/20191106/2001519.html