Выберите Где с несколькими одинаковыми - PullRequest
0 голосов
/ 29 ноября 2010

У меня есть таблица с именем «совпадения», в которой я связываю элементы в таблице «цифры» с элементом в таблице «буквы» через там идентификатор.

Так что это выглядит как

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. :)

Ответы [ 4 ]

2 голосов
/ 29 ноября 2010

Это может работать, а может и не работать во всех случаях, но я попытался с (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 ...

РЕДАКТИРОВАТЬ : Чтобы завершить ответ @ 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';
1 голос
/ 29 ноября 2010

Если вы можете создать строку из списка 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 голосов
/ 30 ноября 2010

Так как предыдущие комментарии сделали проблему больше, чем был ОП, вот еще один ответ ...

Вы можете решить это, имея временные таблицы:

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 - ваш исходный стол в ОП.

0 голосов
/ 29 ноября 2010

вы должны использовать оператор IN для этого.

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

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

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

Спасибо.

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