我有这个 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,这是两个条件的组合.
我怎样才能做到这一点?
答案 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