2017-09-13 26 views
0

フォーラムアプリケーションを作成しています。私はボードを作成するスクリプトを持っています。 autoincremented board_id列に加えて、すべてのボードには、ホームページ上のボードを注文するために使用されるpositionという整数列があります。新しいボードが作成されるとき、私はデフォルトの位置を、与えられたcategory_idを持つボードテーブルの行の中で最大の値にします。ポジションは、カテゴリ内に配置されているため、重複する可能性があります。私はそれが理にかなったことを願う新しいボードはC_ID 1である場合mysqlの列の最大値を見つける方法は?

b_id | c_id | pos | 
------------------- 
    1 | 1 | 1 | 
------------------- 
    2 | 1 | 2 | 
------------------- 
    3 | 2 | 1 | 
------------------- 

そして、私はC_ID 2で新しいボードを作成しています、位置は2でなければなりませんので、私は次のボードを持っている場合

...、位置が希望3。どうすればいいですか?

以下のクエリは、私が現在使用しているものですが、位置は常に0

INSERT INTO `forum_boards` (
    `title`, 
    `description`, 
    `category_id`, 
    `position` 
) VALUES (
    'Suggestion Box', 
    'Have an idea that will help us run things better? Let us know!', 
    '1', 
    '(SELECT MAX(position), category_id FROM forum_boards WHERE category_id = 1)+1' 
) 

答えて

3

あなたが使用しているアプローチを取ることができますされて終わります。単一引用符を削除する必要があります。

INSERT INTO `forum_boards` (`title`, `description`, `category_id`, `position` 
          ) 
    VALUES ('Suggestion Box', 
      'Have an idea that will help us run things better? Let us know!', 
      1, 
      (SELECT MAX(position) + 1 FROM forum_boards WHERE category_id = 1)' 
      ); 

ただし、最初は空のカテゴリは考慮されていません。そして、私はinsert . . . selectを使用して、これを記述します。私は'1'周りの単一引用符を落とし

INSERT INTO `forum_boards` (`title`, `description`, `category_id`, `position` 
          ) 
    SELECT 'Suggestion Box', 
      'Have an idea that will help us run things better? Let us know!', 
      1, 
      COALESCE(MAX(position) + 1, 1) 
    FROM forum_boards 
    WHERE category_id = 1; 

注意。数字は文字列ではなく数値として渡す必要があります。

+0

最初のアプローチでは、カテゴリが空の場合はどうなりますか? selectコマンドは0を返しますか? – ShoeLace1291

+0

@ ShoeLace1291。 。 。最初のアプローチは 'NULL'を返します。それはあなたが使っていたコードです。その場合、2番目は '1'を返します。 –

+0

2番目のアプローチは完全に機能しました!ありがとう – ShoeLace1291

関連する問題