Подтвердить что ты не робот

MySQL соответствует 2 из 5 полей

В MySQL я пытаюсь выбрать любую строку, которая соответствует по меньшей мере двум полям предоставленных данных

Eg. Мне даны firstName, lastName, dob, веб-сайт, электронная почта, и мне нужны строки, соответствующие firstName и lastName, или firstName и электронная почта, или веб-сайт, и т.д. и т.д.

Я знаю, что могу написать очень длинное извращенное выражение в соответствии с (this = this AND this = this) ИЛИ (this = this и т.д.) но этот запрос потенциально может стать действительно большим, особенно если мы решили, что хотим сопоставить более 5 полей.

Нам также нужно ранжировать совпадающие строки, поэтому, если некоторые строки соответствуют 3, а не только минимальным двум полям, то они должны отображаться выше в возвращаемых результатах.

Я мог бы обработать это позже с помощью PHP или выполнить несколько SQL-запросов, мне просто интересно, знает ли кто-нибудь более простой/более простой способ сопоставить эти данные?

Я ценю любую помощь! Jo

4b9b3361

Ответ 1

Вы можете подсчитать соответствующие выражения. MySQL возвращает 1 для true и 0 для false.

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

Вы также можете заказать, используя это. Вы хотите сортировать нисходящий, чтобы гарантировать, что сначала будут отображаться более высокие совпадения.

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

Ответ 2

Как рекомендуется для ответа a'r, вы можете добавлять вместе значения. Если вы хотите использовать это для ранжирования, вы можете не включать его в предложение 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 для проверки этого синтаксиса на данный момент, но я считаю, что он должен работать должным образом.

Ответ 3

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)