mysql - MySQL查询返回最不匹配条件的行
问题描述
我有这个 MySQL 查询:
SELECT a.* FROM TableA a
INNER JOIN TableB b on (a.id = b.id)
WHERE a.somefield = 300 AND a.anotherfield IN ('Option-A','Option-B')
ORDER BY a.field_order ASC
现在棘手的部分是第二个条件AND a.anotherfield IN ('Option-A','Option-B')
,根据它的值,我得到了以下总行:
+------------------------------------+
+ Condition Value | Returned Rows +
+------------------------------------+
+ Option-A | 10 +
+ Option-B | 3 +
+ Option-A, Option-B | 13 +
+------------------------------------+
我只需要返回最少返回的条件行。我仍然需要在查询的条件端包含 Option-A 和 Option-B,但我只想要匹配程度较低的条件的行,即基于上述示例的 3 行,而不是 13 行,这是两个条件的组合.
我怎样才能做到这一点?
解决方案
您可以在查询中使用 COUNT() 窗口函数来计算每个组中的行数,最后使用 CASE 表达式过滤行:
SELECT * -- you may want to enumerate only the columns of TableA
FROM (
SELECT a.*,
COUNT(CASE WHEN a.anotherfield = 'Option-A' THEN 1 END) OVER () opta,
COUNT(CASE WHEN a.anotherfield = 'Option-B' THEN 1 END) OVER () optb
FROM TableA a INNER JOIN TableB b on (a.id = b.id)
WHERE a.somefield = 300 AND a.anotherfield IN ('Option-A','Option-B')
) t
WHERE anotherfield = CASE LEAST(opta, optb)
WHEN opta THEN 'Option-A'
WHEN optb THEN 'Option-B'
END
推荐阅读
- php - 多次刷新页面时,fastCGI 崩溃并出现 500 错误
- prolog - 在 Prolog 中是否可以在语句的左侧进行 NOT 操作?
- wpf - 如何将 .NET Framework 5.0 添加到 Visual Studio Professional 2019?
- php - 捕获“缺少或不正确的 CSRF cookie 类型”。例外
- python - 如何设置连接为字典键的不同值?
- php - openssl_verify():提供的密钥参数不能被强制转换为公钥
- python-3.x - TrainDeepLearningModel 工具在 arcgis pro 中没有响应
- sonarqube-scan - 声纳扫描仪无法创建 report-task.txt 文件
- c++ - 有没有办法用##和#宏将类名和其他字符连接成一个字符串
- css - 同一 .vue 文件中的 Vuejs 作用域和非作用域 CSS