SQL:当有一场比赛时抓到两个?

时间:2011-01-24 14:29:05

标签: sql

对于我的留言系统中的收件人字段,如果您输入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?
}

我该如何解决这个问题?

3 个答案:

答案 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子句,在顶部进行完全匹配等等。

然后,您的客户可以查看每种匹配类型的生成次数,并选择放弃/忽略不相关的匹配项。