2011-08-18 42 views
12

在MySQL中,我試圖選擇與所提供的數據的至少2個字段匹配的任何行MySQL匹配5個字段中的2個

例如,我已經給了名字,姓氏,dob,網站,電子郵件,我想要任何匹配firstName和lastName,或firstName和電子郵件,或網站和電子郵件等行。

我知道我可以寫一個很長的纏繞聲明 (this = this AND this = this)OR(this = this等) 但是這個查詢可能會變得非常大,特別是如果我們決定我們想要匹配超過5個字段。需要對匹配的行進行排名,因此如果某些行匹配3而不是僅匹配最小2個字段,那麼它們在返回的結果中應該顯示得更高。

我可以處理這後來與PHP,或做多個SQL查詢,我只是想知道是否有人知道更容易/更清潔的方式來匹配這些數據?

我感謝任何幫助! Jo

+0

我不認爲長的SQL會傷害任何 – ajreal

回答

11

您可以計算出匹配的表達式。 MySQL返回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數據庫來測試此語法,但我相信它應該可以正常工作。

+0

這是我在想什麼,但我想你會想'HAVING'而不是'WHERE'。 – Wiseguy

+0

@wiseguy爲什麼HAVING?這裏沒有分組,也沒有必要在訂購 –

+1

後過濾*因爲匹配不是表中的實際列。 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)