Question MySQL correspondant à 2 des 5 champs


En MySQL, je tente de sélectionner une ligne correspondant à au moins 2 champs des données fournies

Par exemple. On m'a donné firstName, lastName, dob, website, email et je veux des lignes qui correspondent à firstName et lastName, ou firstName et email, ou site Web et email etc.

Je sais que je pourrais écrire une très longue déclaration sur le long terme (ceci = ceci ET ceci = ceci) OU (ceci = ceci etc. mais cette requête pourrait potentiellement devenir très volumineuse, surtout si nous décidons de faire correspondre plus de 5 champs.

Nous devrons également classer les lignes correspondantes. Par conséquent, si certaines lignes correspondent à 3 au lieu des deux champs minimum, elles devraient apparaître plus haut dans les résultats renvoyés.

Je pourrais ensuite traiter ceci avec PHP, ou faire plusieurs requêtes SQL, je me demandais si quelqu'un connaissait un moyen plus simple / plus propre de faire correspondre ces données?

J'apprécie toute aide! Jo


12
2017-08-18 14:47


origine


Réponses:


Vous pouvez compter les expressions correspondantes. MySQL renvoie 1 pour true et 0 pour false.

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

Vous pouvez également commander en utilisant ceci aussi. Vous voudrez trier par ordre décroissant pour vous assurer que les correspondances les plus élevées apparaissent en premier.

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

11
2017-08-18 14:51



Comme réponse recommandée, vous pouvez ajouter des valeurs ensemble. Si vous souhaitez l'utiliser pour le classement, vous pouvez ne pas l'inclure dans la clause where comme il l'a fait.

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

Je n'ai pas accès à une base de données mysql pour tester cette syntaxe pour le moment, mais je pense que cela devrait fonctionner correctement.


4
2017-08-18 14:55



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)

-1
2017-08-18 15:02