如何在考虑到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”可以是相同的,但不是“世界”,它必须有所不同,我想 它逐渐增加。
我会怎样做这样的事情?
我通常不会做这样的查询,所以我不能肯定地说,但一些像这也许应该做的伎俩。
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值列表;但正如我所说,我通常不会这样做。 (我是明显的少数派,喜欢在插入之前先检查;但不能代替适当的唯一性约束。)
希望有少数1! – Strawberry
@Strawberry为什么希望? – Uueerdo
因为'先检查'是不必要的,并且容易导致竞争条件,由此数据集在第一步完成和第二步开始之间改变。 – 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 |
+-----+-------+------+
您通常不会存储派生数据。 – Strawberry
没有办法做到这一点呢? – ThreeKingz
也许你应该使用辅助自动增量。请参阅http://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html – Barmar