У меня есть таблица под названием "matches", в которой я сопоставляю элементы в таблице "числа" с элементом в таблице "буквы" с помощью идентификатора.
Итак, это выглядит как
number_id, letter_id
1,10
2,10
3,10
5,11
4,23
7,19
1,19
3,64
теперь пользователь вводит массив чисел, например 1,2,3 и я должен найти письмо, где все его цифры равны 1,2,3, что будет 10. Если бы они дали 1,7, это дало бы им 19, если бы они дали 3, это дало бы им и 64.
Как я могу это сделать?
Я пытаюсь написать рекурсивную функцию для этого, но он всегда ломается. есть какой-то вид:
SELECT letter_id WHERE **number_id***s* = 1,2,3. That would be perfect. :)
Это может быть или не работать во всех случаях, но я пробовал с (1,2,3) и (1,7):
select distinct letter_id
from r r1
inner join r r2 using (letter_id)
where r1.number_id in (1, 7)
and r2.number_id in (1,7)
and (r1.number_id r2.number_id);
Вы должны иметь возможность динамически поддерживать (1,7)
или (1,2,3)
с помощью некоторого языка программирования.
Качание ребенка в 3:30 утра...
EDIT: для завершения ответа @Martin вы можете использовать order by field()
select letter_id
from (
select letter_id,
group_concat(number_id order by field(number_id,2,1,3)) as numset
from r
group by letter_id
) as Martin
where numset = '2,1,3';
Если вы можете построить строку из списка number_ids, вы можете использовать следующий запрос:
select letter_id
from (select letter_id, group_concat(number_id) as numset from `matches`
group by letter_id) as fred
where numset = '1,2,3';
Он чувствителен к порядку (например, "2,1,3" не соответствует).
Поскольку предыдущие комментарии сделали проблему больше, чем OP, вот еще один ответ...
Вы можете работать с временными таблицами:
create temporary table r_sum as
select letter_id, count(*) as total
from r
group by letter_id;
create temporary table r_count as
select letter_id, count(*) as total
from r
where number_id in (1,2,3,7)
group by letter_id;
select letter_id
from r_sum
inner join r_count using (letter_id, total);
Я думаю, что если это не ответит на ваш вопрос, я не получаю то, что вы хотите, и как вам помочь. Если таблица огромна, вам придется создавать индексы на временных таблицах, чтобы ускорить работу. r
- ваша исходная таблица в OP.
для этого вам нужно использовать инструкцию IN.
попробуйте выполнить запрос для этого.
SELECT letter_id WHERE number_id IN (1,2,3)
вы можете передать переменную массива в оператор IN, если у вас есть.
Спасибо.