2011-08-18 7 views
12

MySQLでは、提供されたデータの少なくとも2つのフィールドに一致する行を選択しようとしていますMySQLマッチング5フィールドのうち2つ

例:私はfirstName、lastName、dob、ウェブサイト、電子メールを受け取りました。firstNameとlastName、またはfirstNameとemail、またはwebsiteとemailと一致する行が必要です。

私は、 の行(これはこれを=と、これはこれを=)または(本など が、このクエリは、潜在的に、我々は5つの以上のフィールドに一致させたい決める場合は特に、本当に大きな得ることができます。

この=我々はまた、意志一致する行をランク付けする必要があります。したがって、最小2個のフィールドの代わりに3個の行が返された場合は、返された結果の上位に表示されます。

後でPHPを使ったり、複数のSQLクエリを実行したりすることができます。誰かがこのデータにマッチする簡単で洗練された方法を知っているのではないでしょうか?

ご協力いただきありがとうございます。 Jo

+0

私はLONG​​ SQLは素晴らしい仕事を何でも – ajreal

答えて

11

一致する式を数えることができます。真の場合は1、偽の場合は0が返されます。

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

また、これを使用して注文することもできます。より高い一致が最初に現れるように降順をソートしたいと思うでしょう。

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

に害を与えないと思います、ありがとうございました:) – Joanne

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 dbにアクセスできませんが、正しく動作するはずです。

+0

これは、私はあなたがWHERE' 'の代わりに' HAVING'をしたいと思う除いて、私は、考えていたものです。 – Wiseguy

+0

@wiseguyなぜですか?ここでグループ化する必要はなく、注文後に*をフィルタリングする必要はありません –

+1

'Matches'はテーブルの実際のカラムではないためです。 'WHERE'は条件をテーブルの列に置き、' HAVING'は条件を結果セットの列に置きます。 – Wiseguy

-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) 
関連する問題