1

我有一张看起来像的桌子

id  | package | env     | key     | value  
int | varchar | varchar | varchar | varchar

这是为了存储配置,所以在env所在的数据库中会存在一行null

env但是同一行可能会以不同的值再次出现(不同的 id 作为自动增量) 。

我想要做的是获取所有行where package = 'something'env is null,但是如果存在相同的行packagekey然后env = 'something_else我想返回该行而不是行 where 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

如果我使用 packagesomething和 envtesting我想要返回的行是

2 | something | testing     | title  | a testing title
4 | something | null        | byline | a default byline

我可以运行两个查询,一个是获取所有行在哪里package = somethingenv is null然后是另一个查询在哪里package = somethingenv = testing然后将第二个结果合并到第一个,但我希望有一种方法可以用一个查询来做到这一点?

4

2 回答 2

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`)

在这里看小提琴。

在子查询中,我为每个返回不为空package, key的最小 id 。env如果没有 env 不为空的行,则使用 COALESCE 我将返回最小 id。

于 2013-02-15T09:01:15.127 回答
0

你可以试试:

SELECT *
FROM `table`
WHERE `package` = 'something'
    AND ( `env` = 'testing'
        OR `env` IS NULL )
GROUP BY `key`
ORDER BY id ASC
于 2013-02-15T08:56:42.213 回答