Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在具有另一个公共值的列中选择只有一个值的所有行_Mysql_Sql - Fatal编程技术网

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。