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

MySQL查询以返回最不匹配条件的行,mysql,count,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 现在棘手的部分是第二个条件和('Option-a','Option-B')中的另一个字段,根据它的值,我得到了以下行的总数: +--------

我有一个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
现在棘手的部分是第二个条件
和('Option-a','Option-B')
中的另一个字段,根据它的值,我得到了以下行的总数:

+------------------------------------+
+  Condition Value   | Returned Rows +
+------------------------------------+
+ Option-A           |      10       +
+ Option-B           |       3       +
+ Option-A, Option-B |      13       +
+------------------------------------+
我只需要返回条件的最少的返回行。我仍然需要在查询的条件端包含选项A和选项B,但我只需要匹配程度较低的条件的行,即基于上述示例的3行,而不是这两个条件的组合13行

如何实现这一点?

您可以在查询中使用COUNT()窗口函数对每个组中的行进行计数,并最终使用大小写表达式筛选行:

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

您使用的是哪个版本的MySQL?如果两个选项有相同的行数,你想怎么做?我可以使用任何版本的MySQL,如果这样做更容易的话。我希望返回第一组“最少”的行,因此如果两个条件的行数相同,则只返回第一个条件的行。不用担心-回答得好。@forpas这是一个很好的方法!谢谢!注意MySQL也接受不太详细的方法!