请考虑以下表格结构:
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_1
和meta_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;