2011-08-18 13 views
12

W MySQL próbuję wybrać dowolny wiersz, który pasuje do co najmniej 2 pól dostarczonych danych.MySQL pasujące do 2 z 5 pól

Np. Dostałem firstName, lastName, dob, stronę internetową, e-mail i chcę, aby wszystkie wiersze pasowały do ​​firstName i lastName lub firstName i e-mail, lub strony internetowej i e-mail itp.

Wiem, że mogłem napisać bardzo długą zerwaną wypowiedź linie (to = to i to = to) albo (to = to etc ale ta kwerenda może potencjalnie uzyskać naprawdę duże, zwłaszcza jeśli zdecydujemy chcemy dopasować na więcej niż 5 pól.

Będziemy również trzeba uszeregować pasujące wiersze, więc jeśli niektóre wiersze odpowiadają 3, a nie tylko minimum 2 pola, powinny być wyświetlane wyżej w zwróconych wynikach.

Mogę przetworzyć to później z PHP, lub wykonywać wiele zapytań SQL, po prostu zastanawiam się, czy ktoś wie, łatwiejszy/czysty sposób, aby dopasować te dane?

Doceniam każdą pomoc! Jo

+0

Nie sądzę LONG SQL zaszkodzi nic – ajreal

Odpowiedz

11

Można policzyć pasujące wyrażenia. MySQL zwraca 1 dla wartości true, a 0 dla wartości false.

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

Można również zamówić za pomocą tego jak dobrze. Będziesz chciał posortować malejąco, aby upewnić się, że wyższe dopasowania pojawią się jako pierwsze.

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

To było wspaniałe, dziękuję :) – Joanne

4

Jako zalecana przez użytkownika odpowiedź, można dodać wartości. Jeśli chcesz użyć tego do rankingu, możesz nie uwzględniać go w klauzuli where, tak jak on.

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

nie mam dostępu do db mysql do przetestowania tej składni w tej chwili, ale wierzę, że to powinno działać prawidłowo.

+0

To co myślałem, z wyjątkiem myślę, że chcesz 'HAVING' zamiast' WHERE'. – Wiseguy

+0

@wiseguy dlaczego HAVING? Nie ma tu grupowania i nie ma potrzeby filtrowania * po * zamówieniu –

+1

, ponieważ 'Dopasowania' nie jest rzeczywistą kolumną w tabeli. 'WHERE' umieszcza warunki na kolumnach tabeli, natomiast' HAVING' umieszcza warunki na kolumnach zestawów wyników. – 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) 
Powiązane problemy