如何在考虑到SQL中的另一列的情况下选择列中的下一个可用值?

问题描述:

我有以下SQL表:如何在考虑到SQL中的另一列的情况下选择列中的下一个可用值?

bid btype Name  world vi 
    ---|----|------------ |--------|--------- 
    1 | 1 | Business 1 | 0  | 44 
    2 | 4 | Business 2 | 0  | 55 
    5 | 5 | Business 3 | 0  | 23 
    3 | 1 | Business 4 | 1  | 99 
    4 | 2 | Business 5 | 0  | 12 
    6 | 3 | Business 6 | 0  | 14 
    7 | 2 | Business 7 | 1  | 55 
    8 | 1 | Business 8 | 2  | 66 
    9 | 2 | Business 9 | 2  | 77 
    10 | 1 | Business 10 | 3  | 88 

我想是根据其“BTYPE”中的“世界”栏目逐渐增加值,例如每一行与中值0开始“世界专栏 ,因为这是第一次插入”btype“列中的这样的值,我想要的是检查是否已经插入了”btype“,以便”世界“列不再取值为0 1等等...... 我想要实现的是,不能有两行与同一个“世界”共享相同的“btype”,“btype”可以是相同的,但不是“世界”,它必须有所不同,我想 它逐渐增加。

我会怎样做这样的事情?

+0

您通常不会存储派生数据。 – Strawberry

+0

没有办法做到这一点呢? – ThreeKingz

+0

也许你应该使用辅助自动增量。请参阅http://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html – Barmar

我通常不会做这样的查询,所以我不能肯定地说,但一些这也许应该做的伎俩。

INSERT INTO theTable(btype, Name, world, vi) 
SELECT [val1] 
    , [val2] 
    , IFNULL((SELECT MAX(world) FROM theTable WHERE btype = [val1]),-1)+1 
    , [val3] 
; 

你甚至可以只包括3日在一个传统的INSERT选择表达... VALUES值列表;但正如我所说,我通常不会这样做。 (我是明显的少数派,喜欢在插入之前先检查;但不能代替适当的唯一性约束。)

+0

希望有少数1! – Strawberry

+0

@Strawberry为什么希望? – Uueerdo

+0

因为'先检查'是不必要的,并且容易导致竞争条件,由此数据集在第一步完成和第二步开始之间改变。 – Strawberry

例如为:

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(bid INT NOT NULL PRIMARY KEY 
,btype INT NOT NULL 
); 

INSERT INTO my_table VALUES 
(1,1), 
(2,4), 
(5,5), 
(3,1), 
(4,2), 
(6,3), 
(7,2), 
(8,1), 
(9,2), 
(10,1); 

SELECT bid 
    , btype 
    , i 
    FROM 
    (SELECT x.* 
      , CASE WHEN @prev=btype THEN @i:[email protected]+1 ELSE @i:=0 END i 
      , @prev:=btype prev 
     FROM my_table x 
      ,(SELECT @i:=0,@prev:=null) vars 
     ORDER 
      BY btype,bid 
    ) n 
ORDER 
    BY bid; 
+-----+-------+------+ 
| bid | btype | i | 
+-----+-------+------+ 
| 1 |  1 | 0 | 
| 2 |  4 | 0 | 
| 3 |  1 | 1 | 
| 4 |  2 | 0 | 
| 5 |  5 | 0 | 
| 6 |  3 | 0 | 
| 7 |  2 | 1 | 
| 8 |  1 | 2 | 
| 9 |  2 | 2 | 
| 10 |  1 | 3 | 
+-----+-------+------+