示例表:
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
谢谢你的帮助。
5条答案
按热度按时间62o28rlo1#
你可以用
group by
以及having
:基本上,你需要在考试结束后做测试
group by
.如果需要完整的行,请使用
not exists
:tjrkku2a2#
正如其他人所说的,您应该聚合数据,但是这有很多潜在的问题。但在我们开始之前,您已经声明您希望输出中的原始记录—而不是合并数据—最简单的解决方案是使用2个查询—一个用于标识仅状态为0的外部\u 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()方法。
因此。。。。
lawou6xi3#
使用组concat和
DISTINCT
子句,我们根据foreign_id
. 现在进入HAVING
我们只需要过滤掉那些foreign_id
,其中唯一状态为'0'
只是。请尝试以下操作:
cbwuti444#
使用聚合函数
cu6pst1q5#
(我编辑这篇文章是为了证明它是有效的并澄清一些事情):
你可能感兴趣的是having语句。
你可以在小组结束后使用having语句。这里有一个很好的解释:https://www.dofactory.com/sql/having
简言之,having语句所做的是让您过滤作为groupby表达式结果返回的数据。
试试这个:
下面是一个it工作的示例(在基本ms access文件中测试):
然后我输入了这个代码:
我得到了这些结果:
如果你有任何问题,请告诉我!