使用If或Case(或任何其他方法)根据国家/地区代码增加值

时间:2013-01-15 13:38:34

标签: mysql sql

我有这样构建的表,它为每个用户分配一个独特的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;

我希望你明白这一点。

enter image description here enter image description here

3 个答案:

答案 0 :(得分:1)

我建议你使用TRIGGER:

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)
;

see it working here。然后您可以插入而不指定列artcStackId,因为它将自动计算。

答案 1 :(得分:0)

从技术上讲,这会有效,但在重负载期间,您可能会遇到artcStackId重复值的问题。它的效率也不太高。

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

此外,这假设文章表已经为该国家/地区至少有一行。

更好的选择可能是拥有country表,其中包含nextStackId值。在事务中,更新该表中的下一个堆栈ID,选择更新的值,将其用于插入,然后提交事务。这应该更安全。

答案 2 :(得分:0)

如果您创建一个名为Cities的新表,将idCity和numberBeg作为字段,并且您将知道从哪个数字开始计算

,会发生什么?