2016-03-03 3 views
-3

Привет Пожалуйста, обратите внимание на следующую таблицуMysql минус запрос вопрос

 

user_id city_id role_id 
101  1  a 
101  2  b 
101  3  c 

То, что я хочу

 
Input     Output 
city id role_id 
1,2,3     All user_ids present in city_id 1 and 2 and 3 
1,2  c    All user_ids present in city_id 1 and 2 and not present in role_id c 
1   b,c   All user_ids present in city_id 1 and not present in role_id b,c 
2   a,c   All user_ids present in city_id 2 and not present in role_id a,c 

Что самый простой способ сделать это? Примечание. У меня огромное количество записей в таблице, поэтому производительность также имеет значение.

Таким образом, в приведенном выше примере 101 будет возвращен только если я прохожу CITY_ID 1,2,3

Я попытался

 
select user_id, city_id, role_id from foo_table where city_id in 
(1,2) and role_id not in ('c') group by user_id having count(*) = 2; 

и

 
select user_id, city_id, role_id from foo_table where city_id in 
(1,2) and user_id not in (select user_id from foo_table where role_id not in ('c')); 

с неправильными результатами.

Update: мне нужно что-то вроде этого

 

    select * from (select * from foo_table where city_id in (1)) s1 
    inner join (select * from foo_table where city_id in (2)) s2 
    on s1.user_id = s2.user_id 
    and s1.user_id not in (select distinct(user_id) from foo_table where role_id in('c')); 

Я все еще испытывая его.

+0

В таблице вывода, город идентификатор для каждой записи будет пользователя вход? –

+0

да выход будет 3 записи для вышеприведенного случая –

+2

Это очень похоже на домашнее задание ... – sgeddes

ответ

0

У меня возникает ощущение, что вы можете быть чем-то более сложным, чем то, что вы видите ниже, но я попытался интерпретировать ваш короткий вопрос буквально. т. е. для разных наборов критериев вы запрашиваете список user_id, отвечающий этим критериям. SQL Fiddle

MySQL 5.6 Настройка схемы:

CREATE TABLE foo_table 
    (`user_id` int, `city_id` int, `role_id` varchar(1)) 
; 

INSERT INTO foo_table 
    (`user_id`, `city_id`, `role_id`) 
VALUES 
    (101, 1, 'a'), 
    (101, 2, 'b'), 
    (101, 3, 'c'), 
    (101, 4, 'd') 
; 

Запрос 1:

Input     Output 
city id role_id 
1,2,3     All user_ids present in city_id 1 and 2 and 3 

select user_id 
from foo_table 
where city_id in (1,2,3) 
group by user_id 
having count(distinct city_id) = 3 

Results:

| user_id | 
|---------| 
|  101 | 

Запрос 2:

Input     Output 
1,2  c    All user_ids present in city_id 1 and 2 and not 

select user_id 
from foo_table 
where city_id in (1,2) 
and role_id not in ('c') 
group by user_id 
having count(distinct city_id) = 2 

Results:

| user_id | 
|---------| 
|  101 | 

Запрос 3:

Input  Output 
1  b,c All user_ids present in city_id 1 and not present in role_id b,c 

select user_id 
from foo_table 
where city_id in (1) 
and role_id not in ('b','c') 
group by user_id 

Results:

| user_id | 
|---------| 
|  101 | 

Query 4:

Input  Output 
2  a,c All user_ids present in city_id 2 and not present in role_id a,c 

select user_id 
from foo_table 
where city_id in (2) 
and role_id not in ('a','c') 
group by user_id 

Results:

| user_id | 
|---------| 
|  101 | 
+0

спасибо за ответ .. проблема здесь: запрос 1 вернет исходные идентификаторы, которые либо находятся в 1 или 2, либо 3. –

+0

, если бы вы были менее загадочными (краткими), возможно, мы могли бы помочь больше. У вас (по вашему мнению) что-то, чего вы хотите достичь, но в основном Я почти не знаю, что это такое. возвращают идентификаторы, которые находятся в 1 или 2 или 3, потому что это то, что, я считаю, вы просили. Потратьте некоторое время, чтобы точно объяснить, что вы ищете (и отредактируйте вопрос, не используйте для этого комментарии). –

+0

Я изменил запрос 1 –

0

Это то, что мне нужно:

Select a.* 
From foo_table a , 
    (Select user_id 
    From foo_table 
    Where city_id in(1,2) 
      and role_id not in('c') 
    Group by user_id 
    Having count(*) = 2) b 
Where a.city_id in(1,2) 
     And a.city_id = b.city_id;