SQL:在已经有一场比赛的情况下抢两场?
对于我的邮件系统中的收件人字段,如果您输入Megan Fo,它将询问您“您是指Megan Fox吗?”。然后我还有一个“你是说谁?梅根·福克斯,梅根·福克斯,梅根·福克斯谢”如果发现不止一个 当然,如果你做对了,也会有。(如果此SQL语句仅返回1,且完整值为1) 这是工作良好,虽然现在我有一个问题,当我试图发送给用户 “梅格梅格” 然后返回2,“梅格·梅格”和“梅根·福克斯”。我希望它返回一个,只有当它匹配完整的。所以现在我不断地得到“你指的是谁?”当我建立它时,所以如果超过1行数,那么“你指的是谁…”SQL:在已经有一场比赛的情况下抢两场?,sql,Sql,对于我的邮件系统中的收件人字段,如果您输入Megan Fo,它将询问您“您是指Megan Fox吗?”。然后我还有一个“你是说谁?梅根·福克斯,梅根·福克斯,梅根·福克斯谢”如果发现不止一个 当然,如果你做对了,也会有。(如果此SQL语句仅返回1,且完整值为1) 这是工作良好,虽然现在我有一个问题,当我试图发送给用户 “梅格梅格” 然后返回2,“梅格·梅格”和“梅根·福克斯”。我希望它返回一个,只有当它匹配完整的。所以现在我不断地得到“你指的是谁?”当我建立它时,所以如果超过1行数,那么“你指的
如何修复此问题?这会稍微慢一点,但您可以将逻辑分为两个查询,一个使用精确匹配(
=
,而不是像那样的),如果该查询不产生任何结果,则运行当前查询
然而,当用户输入Megan Fox时,这会产生问题,实际上是指Megan Foxy。在SQL语句的末尾,似乎包含了每个名字以“Meg”开头的人,这就是Meg Meg和Megan Fox都匹配的原因。尝试将WHERE子句缩短为:
WHERE users_friends.bID='1' AND users_friends.type = 'friend' AND users_friends.accepted = '1' AND (
(users.firstname = 'Meg' AND users.lastname='Meg') OR
(users.firstname LIKE 'Meg%' AND users.lastname LIKE 'Meg%'))
据我所知,这是您使用“Meg Meg”时的问题。…
-您的代码与“Meg Meg”完全匹配
-您的代码还标识与“Megan Fox”的部分匹配
-如果获得了精确匹配,则不希望包含部分匹配
这里的问题是,返回集中没有一条记录“知道”其他记录
要知道您不想包含部分匹配,您必须已经完成了精确匹配的完整检查
对我来说有两种方法
1)连续但独立的查询…
让您的客户运行精确匹配的查询
如果没有返回任何记录,请运行查询,查找名字和姓氏的部分匹配项
如果没有返回任何记录,请运行查询以查找与名字或姓氏的部分匹配
等等等等
2。在指定匹配类型的位置运行一个查询
向查询中添加如下字段
CASE WHEN (users.firstname = 'Meg' AND users.lastname='Meg') THEN 1
WHEN (users.firstname LIKE 'Meg%' AND users.lastname LIKE 'Meg%') THEN 2
WHEN (users.firstname LIKE 'Meg%' OR users.lastname LIKE 'Meg%') THEN 3
END AS 'match_type'
然后还将其添加到ORDERBY子句中,以便在顶部进行完全匹配,等等
然后,您的客户可以查看生成的每种匹配类型的数量,并选择放弃/忽略不相关的匹配
WHERE users_friends.bID='1' AND users_friends.type = 'friend' AND users_friends.accepted = '1' AND (
(users.firstname = 'Meg' AND users.lastname='Meg') OR
(users.firstname LIKE 'Meg%' AND users.lastname LIKE 'Meg%'))
CASE WHEN (users.firstname = 'Meg' AND users.lastname='Meg') THEN 1
WHEN (users.firstname LIKE 'Meg%' AND users.lastname LIKE 'Meg%') THEN 2
WHEN (users.firstname LIKE 'Meg%' OR users.lastname LIKE 'Meg%') THEN 3
END AS 'match_type'