Выберите Где с несколькими одинаковыми

0

У меня есть таблица под названием "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. :)
  • 0
    Не могли бы вы предоставить больше информации о настройке вашего стола? Прямо сейчас, нет никакого способа помочь вам с вашей проблемой, так как отношения между вашими «элементами» не кажутся инъективными (то есть один к одному). Пожалуйста, дополните.
  • 0
    там действительно не больше. Это довольно случайно. i.tap.tc/172B1e0P2D2z1X342c0O на скриншоте, поля напротив, Letter_id слева, Number_id справа.
Теги:
pdo

4 ответа

2
Лучший ответ

Это может быть или не работать во всех случаях, но я пробовал с (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';
  • 0
    +1 за предложение "упорядочить по". Я этого не знал. Благодарю.
  • 0
    Потрясающие. Является ли numset обязательным термином или это имя поля? Спасибо!
Показать ещё 16 комментариев
1

Если вы можете построить строку из списка 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" не соответствует).

  • 0
    отлично, но как я могу сделать это нечувствительным? :)
  • 0
    Посмотрите на мой ответ, как изменить свой.
0

Поскольку предыдущие комментарии сделали проблему больше, чем 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.

-2

для этого вам нужно использовать инструкцию IN.

попробуйте выполнить запрос для этого.

SELECT letter_id WHERE number_id IN (1,2,3)

вы можете передать переменную массива в оператор IN, если у вас есть.

Спасибо.

  • 0
    Вернет letter_id 10 и 64. Не ожидается ответа
  • 0
    Poonam Bhatt прав, мне нужно что-то, что требует всего в массиве.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню