Mysql 在具有另一个公共值的列中选择只有一个值的所有行
我的桌子:Mysql 在具有另一个公共值的列中选择只有一个值的所有行,mysql,sql,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, 'us
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_类型仅为一个值,而不是任何其他值。换句话说,即使每个付款人都有多个用户,我只希望付款人只使用一种obj_类型
我尝试过使用如下查询:
select * from new_table
where obj_type = 1
group by payer_id;
但这将返回其付款人还具有其他obj_类型的其他用户的行。我正在尝试得到一个如下结果:
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
这将给你每个收入超过100000的人的工资总额
SELECT dept_id, SUM(salary)
FROM employees
GROUP BY dept_id
HAVINF salary > 100000
第二个查询将为您提供所有员工合计收入超过100000的部门,即使没有一名员工的收入达到100000。如果要返回所有行而不对其进行分组,您可以使用分析函数:
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
或者,您可以将exist与上述查询一起使用:
SELECT *
FROM new_table
WHERE payer_id IN (SELECT payer_id
FROM new_table
GROUP BY payer_id
HAVING COUNT(DISTINCT obj_type) = 1)
张贴一个你的输出应该是什么的例子。谢谢你,但我恐怕这没有得到我需要的。如果有多个obj_类型,每个都有不同的用户,但有一个共同的付款人id,我只希望在示例信息中有一个obj_类型的付款人。我尝试了您提到的第一个查询,但它选择了可以包含多个obj_类型的行;如果有多个obj_类型,每个都有不同的用户,但有一个共同的付款人id,我只希望在示例信息中有一个obj_类型的付款人。这正是我的查询所做的。它返回一行payer3。