如何通过MySQL语句筛选cool值大于uncool值的id?
用纯MySQL实现需求:筛选cool值大于uncool值的id
当然可以只用MySQL语句解决这个问题,不用额外编程语言处理!我来给你拆解思路和具体实现:
核心思路
我们需要对每个id分组,分别提取它对应的cool和uncool类型的value,然后直接比较这两个值的大小。用条件聚合就能完美实现这个逻辑。
具体SQL代码
SELECT id FROM your_table_name -- 记得替换成你的实际表名 WHERE type IN ('cool', 'uncool') -- 过滤掉无关类型的行 GROUP BY id HAVING MAX(CASE WHEN type = 'cool' THEN value END) > MAX(CASE WHEN type = 'uncool' THEN value END);
代码逐行解释
WHERE type IN ('cool', 'uncool'):先把none、unapp这些无关类型的数据过滤掉,只保留我们需要的两类,减少分组计算的开销。GROUP BY id:按id分组,这样我们就能针对每个实体单独处理它的cool和uncool数值。HAVING子句:MAX(CASE WHEN type = 'cool' THEN value END):在当前id的分组里,提取type为cool的value(因为每个id的cool类型最多一条,用MAX/MIN/SUM都可以,MAX更稳妥,避免万一有重复数据的情况)。- 同理,
MAX(CASE WHEN type = 'uncool' THEN value END)提取uncool类型的value。 - 最后比较这两个值,只保留
cool值大于uncool值的id。
验证结果
把你的表数据代入这个语句,会得到你预期的结果:
+------+ | id | +------+ | 2 | | 3 | +------+
可选优化:确保id同时存在两类数据
如果担心有些id可能只存在cool或只存在uncool类型,可以在HAVING里加个判断,确保两类数据都存在:
SELECT id FROM your_table_name WHERE type IN ('cool', 'uncool') GROUP BY id HAVING MAX(CASE WHEN type = 'cool' THEN value END) > MAX(CASE WHEN type = 'uncool' THEN value END) AND COUNT(DISTINCT type) = 2; -- 强制要求每个id同时有cool和uncool类型
这样就能精准筛选出符合要求的id了!
内容的提问来源于stack exchange,提问作者MCterra
相关产品推荐
相关产品推荐

