0

このテーブルをこのように作成しました。これにより、ユーザーごとにゼロから始まる一意のarticleIdが割り当てられます。

CREATE TABLE `articles` (
  `artcId` INT(10) NOT NULL AUTO_INCREMENT,
  `artcUserId` INT(10) NOT NULL DEFAULT '0',
  `artcStackId` INT(10) NOT NULL DEFAULT '0',
  `artcTitle` VARCHAR(200) NULL DEFAULT NULL,
  PRIMARY KEY (`artcUserId`, `artcId`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;

各記事に実行中のシリアル番号(artcStackId)を割り当てる部分もあります。コードに表示されます。

ユーザーの国に基づいてartcStackIdを割り当てることはどういうわけか可能ですか?その国コードはphpから取得されます。

例:米国の場合は10001 + 1から開始し、英国の場合は20001 + 1から開始し、CAの場合は30001+1から開始します。

これを行うことは可能ですか?

私の現在のSQLクエリは次のようになります。

insert into articles (artcUserId, artcStackId, artcCountry, artcTitle)
select 4,IFNULL((MAX(artcStackId)+1) ,0),'US','Hello World'
FROM articles;

しかし、私が望む方法は、次のようにする必要があります(これは単なるSQLの例です):

insert into articles (artcUserId, artcStackId, artcCountry, artcTitle)
select 4, IF artcCountry = 'US' then (selct MAX(artcStackId)+1
                                      where artcCountry = 'US'),
       'US','Hello World'
FROM articles;

私はあなたがその考えを理解することを望みます。

ここに画像の説明を入力してください ここに画像の説明を入力してください

4

3 に答える 3

1

トリガーを使用することをお勧めします。

CREATE TRIGGER ins_articles
BEFORE INSERT ON articles
FOR EACH ROW
  SET new.artcStackId=coalesce(
    (select max(artcStackId)
    from articles
    where artcCountry = new.artcCountry)+1,1)
;

またはこのようなもの:

CREATE TRIGGER ins_articles
BEFORE INSERT ON articles
FOR EACH ROW
  SET new.artcStackId=coalesce(
    (select max(artcStackId)
    from articles
    where artcCountry = new.artcCountry)+1,

    case when new.artcCountry = 'US' then 10001
         when new.artcCountry = 'UK' then 20001
         when new.artcCountry = 'CA' then 30001
    end)
;

ここで動作するのを見てください。次に、artcStackId列を指定せずに挿入できます。これは、自動的に計算されるためです。

于 2013-01-15T13:53:21.590 に答える
0

技術的にはこれで機能しますが、artcStackId高負荷時にの値が重複するという問題が発生する可能性があります。また、あまり効率的ではない可能性があります。

INSERT INTO articles (artcUserId,artcStackId,artcCountry,artcTitle) 
SELECT 4,MAX(artcStackId)+1,'US','Hello World' 
FROM articles
WHERE artcCountry = 'US' LIMIT 1

また、これは、articlesテーブルにその国の行が少なくとも1つあることを前提としています。

より良いオプションは、値を含むcountryテーブルを用意することです。nextStackIdトランザクションでは、そのテーブルの次のスタックIDを更新し、更新された値を選択し、それを挿入に使用してから、トランザクションをコミットします。それははるかに安全なはずです。

于 2013-01-15T13:45:03.497 に答える
0

idCityとnumberBegをフィールドとして、リレーションを使用してCitiesという名前の新しいテーブルを作成すると、どの番号からカウントを開始するかがわかります。

于 2013-01-15T16:00:02.680 に答える