我有一张类似
的表格id | package | env | key | value
int | varchar | varchar | varchar | varchar
这是为了存储配置,因此在env为null
的数据库中将存在一行
但同一行可能会再次出现(不同的id作为自动增量)多次,具有不同的env
值。
我想要做的是获取所有行where package = 'something'
和env is null
,但是如果存在具有相同package
和key
以及env = 'something_else
的行然后我想返回那一行而不是env is null
的行。
所以,给定这个数据
1 | something | null | title | a default title
2 | something | testing | title | a testing title
3 | something | development | title | a development title
4 | something | null | byline | a default byline
5 | another | null | title | another default title
6 | another | testing | title | another testing title
如果我使用包something
和env testing
我想要的行是
2 | something | testing | title | a testing title
4 | something | null | byline | a default byline
我可以运行两个查询,一个是获取package = something
和env is null
的所有行,然后是package = something
和env = testing
的另一个查询,然后将第二个结果合并到首先,但我希望有一种方法可以用一个查询来做到这一点吗?
答案 0 :(得分:2)
您可以使用以下内容:
SELECT packages.*
FROM packages
WHERE
id IN (
SELECT coalesce(min(case when env is not null then id end), min(id))
FROM packages
WHERE (env = 'development' or env is null)
GROUP BY package, `key`)
请参阅小提琴here。
在子查询中,对于每个package, key
,我返回env
不为空的最小ID。如果没有env不为null的行,使用COALESCE我将返回最小id。
答案 1 :(得分:0)
您可以尝试:
SELECT *
FROM `table`
WHERE `package` = 'something'
AND ( `env` = 'testing'
OR `env` IS NULL )
GROUP BY `key`
ORDER BY id ASC