2011-08-18 27 views
12

MySQL içinde Verilerin en az 2 alanı ile eşleşen herhangi bir satırı seçmeye çalışıyorumMySQL eşleştirmesi 5 5 alanın 2'si

Ör. Ben firstName, lastName, dob, web sitesi, e-posta verildi ve firstName ve lastName veya firstName ve e-posta veya web sitesi ve e-posta vb. Eşleşen herhangi bir satır istiyorum.

Çok uzun bir sarsılmış bir açıklama yazabilirim biliyorum satırları (bu = vE bu =) OR (bu vb ama bu sorgu potansiyel olarak biz 5'ten fazla alanlara eşleşmesini istediğiniz karar, özellikle gerçekten büyük alabilir.

bu = Biz de olacak eşleşen satırları sıralamak gerekir, bu nedenle bazı satırlar yerine sadece asgari 2 alanların 3 maç ise o zaman iade sonuçlarında daha üst göstermek gerekir.

Ben işleyebileceğimiz Bunu daha sonra PHP ile ya da birden çok SQL sorgusu yaparak, sadece bu verileri eşleştirmek için daha kolay/daha temiz bir yol biliyor mu?

Herhangi bir Yardım takdir! Jo

+0

Ben UZUN SQL harika çalıştı şey – ajreal

cevap

11

Sen eşleşen ifadelerini kadar sayabilirsiniz. MySQL true için 1, false için 0 değerini döndürür.

Ayrıca bunu kullanarak da sipariş verebilirsiniz. Daha yüksek eşleşmelerin önce göründüğünden emin olmak için azalan sıralamak isteyeceksiniz.

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

zarar verecek sanmıyorum, teşekkürler :) – Joanne

4

Adrenalin önerdiği gibi değerleri bir araya getirebilirsiniz. Bunu sıralamak için kullanmak isterseniz, onu olduğu gibi eklemeye dahil etmeyebilirsiniz.

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

Şu anda bu sözdizimini sınamak için bir mysql db erişimi yok, ama düzgün çalışması gerektiğine inanıyoruz.

+0

Bu seni WHERE' 'yerine' HAVING' isterdi dışında Düşündüm budur. – Wiseguy

+0

@wiseguy neden HAVING? Hiçbir gruplaşma burada ve gerek * sonra süzmek için * Matches' bir tablo gerçek bir sütun değil 'Çünkü –

+1

sipariş. "HAVA", sonuçlar sütunlarına koşul koyarken "WHERE", tablo sütunlarına koşulları koyar. – 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)