1

次のようなテーブルがあります

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

これは構成を保存するためのものであるため、env が存在するデータベースに行が存在します。null

ただし、同じ行が (自動インクリメントとは異なる id で) 異なるenv値で数回表示される可能性があります。

私がやりたいのは、すべての行where package = 'something'とを取得することですenv is nullが、同じ行が存在する場合は、行の代わりにその行を返したいと思いpackageます。keyenv = 'something_elseenv 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と envを使用する場合、testing返してほしい行は

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

2 つのクエリを実行することpackage = somethingenv is nullできpackage = somethingますenv = 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`)

ここでフィドルを参照してください。

サブクエリでは、nullpackage, keyではないすべての最小 IDを返しています。envenv が null でない行がない場合、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 に答える