Запрос, чтобы получить общие значения - PullRequest
0 голосов
/ 17 августа 2011

У меня есть таблица, как

userId  classId 
1        1           
2        1          
3        1 
1        2 
2        2 
1        3 
2        4
3        5 

В приведенном выше описании [1, 2, 3] делят класс 1. [1, 2] делят класс 2 и т. Д.

Если я задаю userId 1, 2, 3 в запросе, который должен вернуть classId 1.

Если я задаю 1 и 2, запрос должен вернуть 2.

Если я даю 1, запрос должен вернуть 3.

Как я могу написать запрос MySQL для этого?

Ответы [ 4 ]

1 голос
/ 17 августа 2011

Требуемый вам оператор связи - деление , широко известный как «поставщик, поставляющий все детали» .

Поскольку вы не считаете class = 1 действительным результатом, если ему дано user = {1, 2}, вы должны смотреть на точное деление (т.е. без остатка). Вам также необходимо учитывать, какой результат должен получить пустой делитель.

0 голосов
/ 17 августа 2011

Это было протестировано с Postgresql, но я вполне уверен, что он должен работать без особых изменений под mysql.

Настройка таблицы

drop table classes;

create table classes (
    user_id     integer,
    class_id    integer
);

insert into classes values(1, 1);
insert into classes values(2, 1);
insert into classes values(3, 1);
insert into classes values(1, 2);
insert into classes values(2, 2);
insert into classes values(1, 3);
insert into classes values(2, 4);
insert into classes values(3, 5);

1, 2, 3

select max(class_id) from
(
  select class_id
  from classes
  where user_id = 1

  intersect

  select class_id
  from classes
  where user_id = 2

  intersect

  select class_id
  from classes
  where user_id = 3
) as foo;

1, 2

select max(class_id) from
(
  select class_id
  from classes
  where user_id = 1

  intersect

  select class_id
  from classes
  where user_id = 2
) as foo;

1 (Можно упростить, но я предпочитаю это из соображений симметрии)

select max(class_id) from
(
  select class_id
  from classes
  where user_id = 1
) as foo;
0 голосов
/ 17 августа 2011

Вы можете использовать такой запрос (для пользователей 1,2,3) -

SELECT t1.classId FROM (SELECT * FROM users_classes WHERE userId = 1) t1 -- for userId = 1
  JOIN (SELECT * FROM users_classes WHERE userId = 2) t2 ON t1.classId = t2.classId -- for userId = 2
  JOIN (SELECT * FROM users_classes WHERE userId = 3) t3 ON t1.classId = t3.classId -- for userId = 3

Для пользователей 1,2 -

SELECT t1.classId FROM (SELECT * FROM users_classes WHERE userId = 1) t1 -- for userId = 1
  JOIN (SELECT * FROM users_classes WHERE userId = 2) t2 ON t1.classId = t2.classId -- for userId = 2

Этот запрос выведет все возможныеclassId, чтобы получить один classId, вы можете добавить LIMIT или агрегатную функцию.

0 голосов
/ 17 августа 2011
    Try this


      SELECT DISTINCT (
        classId
        )
        FROM `data`
        WHERE userid =1
        OR userid =2 or classid = 3            
        LIMIT 0 , 1

        SELECT DISTINCT (
        classId
        )
        FROM `data`
        WHERE userid =1
        OR userid =2            
        LIMIT 1 , 1

   SELECT DISTINCT (
        classId
        )
        FROM `data`
        WHERE userid =1     

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