我的桌子:
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
提前致谢。
答案 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)