2010-05-25 72 views
0

我正在尝试构建一个相当具体的查询,以根据它们已注册的主题查找一组user_id。 不幸的是,重构表格是不可能的,所以我必须用我得到的东西去做。查找特定行

与USER_ID单桌和registration_id 我需要找到一个有一个registration_id所有user_ids(4或5),而不是1

每一行是一个单一的user_id/registration_id组合。我的SQL技能并不是最好的,所以我真的很抓我的大脑。任何帮助将不胜感激。

+0

您的标准是混乱给我。如果注册ID必须是4或5,为什么要检查它是否不是一个? – pro3carp3 2010-05-25 16:05:39

回答

1
SELECT * 
FROM (
     SELECT DISTINCT user_id 
     FROM registrations 
     ) ro 
WHERE user_id IN 
     (
     SELECT user_id 
     FROM registrations ri 
     WHERE ri.registration_id IN (4, 5) 
     ) 
     AND user_id NOT IN 
     (
     SELECT user_id 
     FROM registrations ri 
     WHERE ri.registration_id = 1 
     ) 

最可能的是,user_id, registration_idPRIMARY KEY您的表。如果不是,则在(user_id, registration_id)上创建一个复合索引,以便快速工作。

+0

这就是诀窍。毕竟,我非常亲密。错过了非常优雅的选择不同部分 – TomCDona 2010-05-25 16:13:31

0

也许不能做到这一点的最好办法(我SQL技能是不是最好的),但应该做的工作:

SELECT user_id 
FROM table AS t 
WHERE registration_id IN (4, 5) 
    AND NOT EXISTS (SELECT user_id 
        FROM table 
        WHERE user_id = t.user_id 
         AND registration_id = 1); 
0

另一种方式与消除USER_ID的副本:

SELECT user_id 
     FROM registrations 
     WHERE registration_id IN (4, 5) 
except 
SELECT user_id 
     FROM registrations 
     WHERE registration_id =1 

一个一表多用:

select user_id from registrations 
where registration_id <=5 
group by user_id 
having MIN(registration_id)>1 and MAX(registration_id)>= 4 
+0

的布局。 – TomCDona 2010-05-26 13:42:01