选择列中只有一个值的所有行和另一个常用值

时间:2017-07-05 15:36:46

标签: mysql sql

我的桌子:

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');

我正在尝试选择所有付款人ID,其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

提前致谢。

2 个答案:

答案 0 :(得分: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的部门,即使没有一名员工获得如此多的收入。

答案 1 :(得分: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)