选择所有行只有一个列的值与另一个共同的价值
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
在此先感谢。
,实际上是很容易:
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的部门,即使没有单个员工赚得那么多。
谢谢,但我恐怕没有得到我需要的东西。如果有多个obj_types,每个都有不同的用户,但有一个普通的付款人ID,我只希望在我的示例信息中有一个obj_type的付款人。我尝试了你提到的第一个查询,但它选择了可以包含多个obj_type的行。 – sarcastasaur
得到它NOW-这工作:'SELECT * FROM NEW_TABLE \t组由payer_id \t具有计数(不同OBJ_TYPE)= 1 \t和OBJ_TYPE = 3;' – sarcastasaur
“如果有多个obj_types,每个具有不同的用户,但一普通付款人ID,我只想要在我的示例信息中拥有一个obj_type的付款人。“这正是我的查询所要做的。它返回一行“payer3”。 – fhossfel
如果你想返回所有行,而不将它们分组,您可以使用分析功能:
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)
发表你的输出的例子应该。 – justiceorjustus