有条件地在mysql中的两行之间进行选择?

时间:2013-02-15 08:48:42

标签: mysql

我有一张类似

的表格
id  | package | env     | key     | value  
int | varchar | varchar | varchar | varchar

这是为了存储配置,因此在env为null的数据库中将存在一行

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

我想要做的是获取所有行where package = 'something'env is null,但是如果存在具有相同packagekey以及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 = somethingenv is null的所有行,然后是package = somethingenv = testing的另一个查询,然后将第二个结果合并到首先,但我希望有一种方法可以用一个查询来做到这一点吗?

2 个答案:

答案 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