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

此外,这假设该 article 表已经具有该国家/地区的至少一行。

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

于 2013-01-15T13:45:03.497 回答
0

如果您创建一个名为 Cities 的新表,其中 idCity 和 numberBeg 作为字段,并且您将知道从哪个数字开始计数的关系,会发生什么情况

于 2013-01-15T16:00:02.680 回答