MySQL匹配5个字段中的2个

时间:2011-08-18 14:47:58

标签: mysql

在MySQL中,我试图选择与所提供数据的至少2个字段匹配的任何行

EG。我已获得firstName,lastName,dob,网站,电子邮件,我想要任何与firstName和lastName,firstName和email,或网站和电子邮件等匹配的行。

我知道我可以写出一个很长的啰嗦声明 (这=这个和这个=这个)或者(这=这个等等 但是这个查询可能会变得非常大,特别是如果我们决定要匹配超过5个字段。

我们还需要对匹配的行进行排名,因此如果某些行匹配3而不是仅匹配最少2个字段,那么它们应该在返回的结果中显示得更高。

我之后可以用PHP处理它,或者做多个SQL查询,我只是想知道是否有人知道更简单/更清晰的方法来匹配这些数据?

我感谢任何帮助! 乔

3 个答案:

答案 0 :(得分:11)

您可以计算匹配的表达式。 MySQL为true返回1,false为0。

WHERE (FirstName = ?) + (LastName = ?) + (... = ?) > 2

您也可以使用此订单。您需要对降序进行排序,以确保首先出现较高的匹配。

ORDER BY ((FirstName = ?) + (LastName = ?) + (... = ?)) DESC

答案 1 :(得分:4)

作为推荐的答案,您可以将值加在一起。如果你想将它用于排名,你可能不会像在那里那样将它包含在where子句中。

SELECT *, ((firstName = @inputFirst) + (lastName = @inputLast) + (dob = @inputDob) + (website = @inputWebsite) + (email = @inputEmail)) as Matches
FROM mytable
HAVING Matches > 1
ORDER BY Matches DESC

我目前无法访问mysql数据库来测试此语法,但我相信它应该可以正常工作。

答案 2 :(得分:-1)

SELECT
(CASE WHEN Field1 = Value1 THEN 1 ELSE 0 END
+CASE WHEN Field2 = Value2 THEN 1 ELSE 0 END
...
+CASE WHEN FieldN = ValueN THEN 1 ELSE 0 END
)
AS Conditions
From YourTable
WHERE Conditions >= (Min_Number_Of_Fields)