mysql-选择列值仅为0的行,按另一列分组?

rbpvctlc  于 2021-06-21  发布在  Mysql
关注(0)|答案(5)|浏览(438)

示例表:

ID, foreign_id, status

这个 ID 是独一无二的 foreign_id 不是。示例行:

1, 1111, 0  
2, 2222, 0  
3, 3333, 1
4, 1111, 1
5, 4444, 0

我想选择的是独一无二的 foreign_id 只有状态为0的。如果它的状态为0,但另一个具有相同外部id的行的状态为1,则不要选择该行 foreign_id . 预期产量:

1, 2222, 0
5, 4444, 0

我可以选择在哪里 status = 0 和分组依据 foreign_id ,但这只会选择状态为0的行,即使可能有另一行具有相同的状态 foreign_id 状态为1。

SELECT ID, foreign_id 
FROM table 
WHERE status = 0 
GROUP BY foreign_id

谢谢你的帮助。

62o28rlo

62o28rlo1#

你可以用 group by 以及 having :

select foreign_id, max(status) as status
from t
group by foreign_id
having max(status) = 0;

基本上,你需要在考试结束后做测试 group by .
如果需要完整的行,请使用 not exists :

select t.*
from t
where not exists (select 1
                  from t t2
                  where t2.foreign_id = t.foreign_id and t2.status <> 0
                 );
tjrkku2a

tjrkku2a2#

正如其他人所说的,您应该聚合数据,但是这有很多潜在的问题。但在我们开始之前,您已经声明您希望输出中的原始记录—而不是合并数据—最简单的解决方案是使用2个查询—一个用于标识仅状态为0的外部\u id,另一个用于获取相应的行

SELECT r.*
FROM examples r
JOIN ( SELECT s.foreign_id, MAX(s.status)
  FROM examples s
  GROUP BY s.foreign_id
  HAVING MAX(s.status)=0
) t
ON r.foreign_id=t.foreign_id

或者你可以得到外国身份证在哪里状态=0并排除第二个查询中的查询-这可能更有效,具体取决于数据的分布。
如果“状态”小于0,则会出现这种情况。输出将包括这些行(sum()可能会发生同样的情况)。有几种方法可以解决这个问题,例如sum(abs(status))或sum(if(status=0,0,1))。正如madhur所建议的那样,您还可以对concat(status)进行分组,并检查列的输出是否只有“0”。
但我怀疑你会告诉我,状态不能是负数(或空值?),因为它是一个名义数字。如果是这种情况,那么您使用了错误的数据类型-您应该使用枚举。如果是这种情况,则不能对枚举应用sum()或max(),但仍可以使用sum(if(status=?,0,1))或group_concat()方法。
因此。。。。

SELECT r.*
FROM examples r
JOIN ( SELECT s.foreign_id, SUM(IF(status=0,0,1))
  FROM examples s
  GROUP BY s.foreign_id
  HAVING SUM(IF(status=0,0,1))=0
) t
ON r.foreign_id=t.foreign_id
lawou6xi

lawou6xi3#

使用组concat和 DISTINCT 子句,我们根据 foreign_id . 现在进入 HAVING 我们只需要过滤掉那些 foreign_id ,其中唯一状态为 '0' 只是。
请尝试以下操作:

SELECT ID, foreign_id, status, GROUP_CONCAT(DISTINCT status) as statuses 
FROM table 
GROUP BY foreign_id 
HAVING statuses = '0'
cbwuti44

cbwuti444#

使用聚合函数

select * from t where foreign_id in (
     select foreign_id
        from t
        group by foreign_id
        having min(status) = 0
       ) and status!=1
cu6pst1q

cu6pst1q5#

(我编辑这篇文章是为了证明它是有效的并澄清一些事情):
你可能感兴趣的是having语句。
你可以在小组结束后使用having语句。这里有一个很好的解释:https://www.dofactory.com/sql/having
简言之,having语句所做的是让您过滤作为groupby表达式结果返回的数据。
试试这个:

SELECT 
     foreign_id, MAX(status) AS status
FROM
     myTable
GROUP BY 
     foreign_id
HAVING 
     MAX(status) = 0

下面是一个it工作的示例(在基本ms access文件中测试):

然后我输入了这个代码:

我得到了这些结果:

如果你有任何问题,请告诉我!

相关问题