对于我的留言系统中的收件人字段,如果您输入Megan Fo,它会询问您“您的意思是Megan Fox吗?”。然后我还有一个“你的意思是谁?Megan Fox,Megan Foxxy,Megan Foxxie”,如果发现不止一个。
然后当然,如果你做对了。 (如果此SQL语句仅返回1并且full为1)。
SELECT users.id, users.firstname, users.lastname,
(users.firstname = 'Meg' AND users.lastname = 'Meg') AS full FROM users
INNER JOIN users_friends ON users.id=users_friends.uID
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%') OR
users.firstname LIKE 'Meg%' OR
users.lastname LIKE 'Meg%')
虽然现在我在尝试发送给用户
时遇到问题,但工作正常 “梅格梅”然后它返回2,“Meg Meg”和“Megan Fox”。我希望它只有在匹配完整时返回一个。所以现在我不断得到“你的意思是谁?”因为我建立了它,所以如果超过1行数,那么“你的意思是谁......”
if($sql_findUser->rowCount() == 1){
$get = $sql_findUser->fetch();
if($get["full"] == 1){
echo "SUCCESS, ONE FOUND FULL MATCH"
}else{
echo "Did you mean ...?"
}
}elseif($sql_findUser->rowCount()>1){
Who did you mean?
}
我该如何解决这个问题?
答案 0 :(得分:0)
它会慢一点,但你可以在两个查询中拆分逻辑,一个使用完全匹配(=
而不是like
),如果那个不产生任何东西,那么运行当前查询。
然而,当用户进入Megan Fox时,这会产生问题,并且真正意味着Megan Foxxy。
答案 1 :(得分:0)
在你的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%'))
答案 2 :(得分:0)
据我所知,使用“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'
然后还将它添加到ORDER BY子句,在顶部进行完全匹配等等。
然后,您的客户可以查看每种匹配类型的生成次数,并选择放弃/忽略不相关的匹配项。