MySQL查询返回最不匹配条件的行

时间:2021-01-17 22:17:30

标签: mysql count

我有这个 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       +
+------------------------------------+

我只需要返回条件的 LEAST 返回行。我仍然需要在查询的条件端包含 Option-A 和 Option-B,但我只想要匹配度较低的条件的行,即基于上述示例的 3 行,而不是 13,这是两个条件的组合.

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

您可以在查询中使用 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
相关问题