2017-07-05 99 views
-1

我的表:选择所有行只有一个列的值与另一个共同的价值

drop table if exists new_table; 
create table if not exists new_table(
    obj_type int(4), 
    user_id varchar(30), 
    payer_id varchar(30) 
); 

insert into new_table (obj_type, user_id, payer_id) values 
    (1, 'user1', 'payer1'), 
    (1, 'user2', 'payer1'), 
    (2, 'user3', 'payer1'), 
    (1, 'user1', 'payer2'), 
    (1, 'user2', 'payer2'), 
    (2, 'user3', 'payer2'), 
    (3, 'user1', 'payer3'), 
    (3, 'user2', 'payer3'); 

我想选择所有的计费用户标识的,其OBJ_TYPE只有一个值,而不是任何其他值。换句话说,即使每个付款人都有多个用户,我只想要只使用一个obj_type的付款人。

我一直在使用的查询像这样尝试:

select * from new_table 
    where obj_type = 1 
    group by payer_id; 

但这返回行,其纳税人也有其他的用户与其他obj_types。我试图得到如下结果:

obj | user | payer 
----|-------|-------- 
3 | user1 | payer3 
3 | user2 | payer3 

在此先感谢。

+0

发表你的输出的例子应该。 – justiceorjustus

回答

1

,实际上是很容易:

SELECT player_id 
FROM new_table 
GROUP BY player_id 
HAVING COUNT(DISTINCT obj_type) = 1 

有过滤器行一样,WHERE,但它聚集后这样做。

的区别是最好的例子来说明:

SELECT dept_id, SUM(salary) 
FROM employees 
WHERE salary > 100000 
GROUP BY dept_id 

这会给你的人每收入超过10万的工资总和。

SELECT dept_id, SUM(salary) 
FROM employees 
GROUP BY dept_id 
HAVINF salary > 100000 

第二个查询将为您提供所有员工共同赚取超过100000的部门,即使没有单个员工赚得那么多。

+0

谢谢,但我恐怕没有得到我需要的东西。如果有多个obj_types,每个都有不同的用户,但有一个普通的付款人ID,我只希望在我的示例信息中有一个obj_type的付款人。我尝试了你提到的第一个查询,但它选择了可以包含多个obj_type的行。 – sarcastasaur

+0

得到它NOW-这工作:'SELECT * FROM NEW_TABLE \t组由payer_id \t具有计数(不同OBJ_TYPE)= 1 \t和OBJ_TYPE = 3;' – sarcastasaur

+0

“如果有多个obj_types,每个具有不同的用户,但一普通付款人ID,我只想要在我的示例信息中拥有一个obj_type的付款人。“这正是我的查询所要做的。它返回一行“payer3”。 – fhossfel

1

如果你想返回所有行,而不将它们分组,您可以使用分析功能:

SELECT * FROM (
    SELECT obj_type,user_id, 
     payer_id, 
     COUNT(DISTINCT obj_type) OVER (PARTITION BY payer_id) AS distinct_obj_type 
    FROM new_table) 
WHERE distinct_obj_type = 1 

或者你可以使用上面的查询存在:

SELECT * 
FROM new_table 
WHERE payer_id IN (SELECT payer_id 
        FROM new_table 
        GROUP BY payer_id 
        HAVING COUNT(DISTINCT obj_type) = 1) 
相关问题