MySQL group with条件where子句

时间:2016-09-19 18:43:13

标签: mysql group-by

请考虑以下表格结构:

id | group | meta_1 | meta_2 | 1 | 1 | null | null | 2 | 1 | foo | null | 3 | 1 | null | bar | 4 | 2 | null | null | 5 | 2 | foo | null | 6 | 2 | null | bar |

您可以看到我有6行,其中3行属于group 1,其中3行属于group 2。

我想从第一组中选择1行,从第2组中选择1行。但是,简单的GROUP BY group是不够的,因为每个组中返回的实际行必须依赖于以下规则:

  • 如果查询中为meta_1指定的值不为null,并且与行匹配,则从该组返回该行
  • 否则,如果查询中为meta_2指定的值不为null,并且与行匹配,则返回该行的该行
  • 否则,返回meta_1meta_2都为空的行

以下给出的参数:

meta_1 = foo meta_2 = bar

将返回:

id | group | meta_1 | meta_2 | 1 | 1 | foo | null | 5 | 2 | foo | null | 因为它们匹配meta_1 = foo,以及以下内容:

meta_1 = baz meta_2 = bar

将返回:

id | group | meta_1 | meta_2 | 3 | 1 | null | bar | 6 | 2 | null | bar | 因为meta_1 = baz不匹配,所以它会回落到匹配的meta_2。最后:

meta_1 = baz meta_2 = bob

meta_1 = null meta_2 = null

两者都会回归:

id | group | meta_1 | meta_2 | 1 | 1 | null | null | 3 | 2 | null | null | 因为没有meta_*匹配。

任何人都可以建议我如何实现这个条件逻辑并将它与一个组合起来。

更新

我想我已经通过下面的查询解决了这个问题,请注意优先顺序是由我编写SELECT查询的顺序定义的:

SELECT id, group, meta_1, meta_2 FROM ( SELECT * FROM table WHERE meta_1 <=> 'foo' UNION ALL SELECT * FROM table WHERE meta_2 <=> 'bar' UNION ALL SELECT * FROM table WHERE meta_1 IS NULL AND meta_2 IS NULL ) derived_table GROUP BY group;

0 个答案:

没有答案