2016-08-03 27 views
1

我有以下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

回答

0

我通常不會做這樣的查詢,所以我不能肯定地說,但一些這也許應該做的伎倆。

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

1

例如爲:

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 | 
+-----+-------+------+ 
相關問題