0

以下のクエリは、テーブルに少なくとも 1 つの行がある場合に機能します。を返すイベントで 1 を返したいNULL

mysql> desc users_map_item;
+----------------+-----------------------+------+-----+---------+-------+
| Field          | Type                  | Null | Key | Default | Extra |
+----------------+-----------------------+------+-----+---------+-------+
| map_user_id    | mediumint(8) unsigned | NO   | MUL | NULL    |       |
| map_item_id    | mediumint(8) unsigned | NO   | PRI | NULL    |       |
| unique_item_id | mediumint(8) unsigned | NO   |     | NULL    |       |
| item_owner     | mediumint(8) unsigned | NO   |     | NULL    |       |
| privilege      | tinyint(1)            | YES  |     | NULL    |       |
+----------------+-----------------------+------+-----+---------+-------+

SELECT case when unique_item_id IS NULL then isnull(max(unique_item_id)+1) else     
max(unique_item_id)+1 end as unique_item_id FROM users_map_item WHERE map_user_id = 1;
4

3 に答える 3

2
SELECT MAX(COALESCE(unique_item_id, 0)) + 1 FROM users_map_item WHERE ...

トリックを行う必要があります。

于 2013-07-28T20:51:47.660 に答える
2

isnull(max(unique_item_id)+1)と入力するだけではなく、1.

于 2013-07-28T20:52:56.640 に答える
1

値が の場合、NULL1 を追加すると値が作成されNULLます。

また、caseステートメントはmax()条件に集計関数を使用する必要があります。

SELECT (case when max(unique_item_id) IS NULL then 1
             else max(unique_item_id)+1
        end) as unique_item_id
FROM users_map_item
WHERE map_user_id = 1;

これは次のように簡略化できます。

select coalesce(max(unique_item_id)+1, 1)
FROM users_map_item
WHERE map_user_id = 1;

編集: 以下は、この特定のケースにおける非表示の列 (MySQL 拡張機能) の倒錯性に関するものです。行がない場合、元のクエリは少し気が遠くなります。次のクエリは、 の値を持つ 1 つの行を返しますNULL

select max(unique_item_id)
from users_map_item
where map_user = 1;

ただし、このクエリは行を返しませんNULL。これは、値を持つ行と同じではありません。

select unique_item_id
from users_map_item
where map_user = 1;

この式は 2 つを混ぜ合わせたものです。

SELECT (case when unique_item_id IS NULL then 1
             else max(unique_item_id)+1
        end) as unique_item_id
FROM users_map_item
WHERE map_user_id = 1;

1 行または 0 行を返しますか? 集計クエリなので答えは「1」です。しかしunique_item_id、その行の値は何ですか? まあ、そんな価値はありません。「なし」は とは異なると主張しNULLますが、MySQL はそれを として扱いNULLます。これがクエリが機能する理由です。これは、他のほとんどのデータベースでは機能しません。

于 2013-07-28T20:52:51.627 に答える