Запрос в БД на совпадение 4 чисел из 5

computerworks

Новичок
В бд есть поле вида *****, где вместо * находятся цифры от 0 до 9, не повторяющиеся в рамках одного поля.
Есть некая комбинация, например, 10483.
Нужно выбрать из данного поля все значения, у которых будут 4 совпадения из 5 (порядок не важен).
Как выбрать в случае совпадения со всеми 5-ю цифрами разобрался, получится нечто вида
SELECT * FROM table WHERE pole LIKE '%$number1%' AND pole LIKE '%$number2%' AND.... где $number1 - первый символ комбинации (1) и т.д.
Как быть в случае 4 совпадений?
Не городить же костыли из комбинаций OR и AND, их там получится множество, может быть есть какая-нибудь функция или регулярное выражение?
 

fixxxer

К.О.
Партнер клуба
использовать вместо текстового поля set или битмаску на 10 бит
 

~WR~

Новичок
Если совсем не менять схему данных, то вот так можно.
PHP:
SELECT *
FROM table
WHERE (CASE WHEN pole LIKE '%$number1%' THEN 1 ELSE 0 END) 
    + (CASE WHEN pole LIKE '%$number2%' THEN 1 ELSE 0 END)
    + (CASE WHEN pole LIKE '%$number3%' THEN 1 ELSE 0 END)
    + (CASE WHEN pole LIKE '%$number4%' THEN 1 ELSE 0 END)
    + (CASE WHEN pole LIKE '%$number5%' THEN 1 ELSE 0 END)
    = 4
Но лучше как-то по-другому хранить, чтобы хотя можно было сделать GROUP BY + HAVING.
Ну или брать нормальную СУБД с композитными типами, в которой можно шустренько посчитать array_intersect в одну операцию.
 

itprog

Cruftsman
~WR~
тогда уж
PHP:
select * from table where field regexp "^[$num]*[^$num]{0,1}[$num]*$"
хотя правильнее все же с бит маской
 

~WR~

Новичок
Точно 4 совпадения из пяти вариантов. Как ты это регуляркой сделаешь?
 

itprog

Cruftsman
~WR~
ошибся в регулярке немного, ты про это?

как я понял дано число и его цифры это и есть варианты.
 
Сверху