2017-10-05 72 views
0

所以我的問題是:什麼是檢查哪些行從1 - 14丟失,然後到INSERT我的新值進入開放行的最佳方法。Mysql:按順序將值插入缺口

我知道這是沒有必要填寫您的數據庫中的差距,但我做在PHP的課程,我需要做到以下幾點:

我有primary key表設置爲id,但不是auto_increment。因此,如果14個值中的一個被刪除,則需要將新值置於空位中。

我已經讀了一點點,發現了一些關於SO的問題,但他們都只是想檢查是否存在差距,我不知何故需要告訴它什麼和它允許更新值。

我有這個

SELECT MIN(t1.position_id)+1 AS unused 
    FROM playerposition AS t1 
    WHERE NOT EXISTS (SELECT * FROM playerposition AS t2 WHERE t2.position_id = t1.position_id+1) 
    UNION 
    -- Special case for missing the first row 
    SELECT 1 
    FROM DUAL 
    WHERE NOT EXISTS (SELECT * FROM playerposition WHERE position_id = 1) 
) AS subquery 

但是,只返回第一行,我真的不明白查詢。任何幫助,建議或指導將不勝感激。

UPDATE

我已經進行了更改查詢和我現在明白了空值。我的新的查詢看起來像這樣

SELECT a AS id, b AS next_id, (b - a) -1 AS missing_inbetween 
FROM 
    (
    SELECT a1.position_id AS a, MIN(a2.position_id) AS b 
    FROM playerposition AS a1 
     LEFT JOIN playerposition AS a2 ON a2.position_id > a1.position_id 
    WHERE a1.position_id <= 14 
    GROUP BY a1.position_id 
) AS tab 

WHERE 
    b > a + 1 

我仍然需要與INSERT一部分,儘管

+0

如果您在php中學習課程,您可能需要在php中執行此操作(例如使用循環)。值1-14聽起來非常具體。你的任務是填補每一個缺失的值(就像你的第二個查詢看起來一樣)?或者只有一個(如你的第一個查詢和你的解釋暗示)?如果所有從1到14的值都已經存在,會發生什麼?所以我會重新檢查你的任務,也許你錯過了一些東西。一般來說:你可以簡單地通過insert into tablename(column1,...)來從select中插入值。選擇你的select-query-with-the-right-amount-of-columns-to-fit-the-columnname-list - 從插入' – Solarflare

+0

不,我不需要填寫每個值。如果發佈新值,我需要檢查表格,看看是否存在1到14之間的差距,如果找到了,那麼我將該值插入該差距,如果不是,則只需要回顯一些內容。如果值2被刪除,我需要用相同的PK值替換2 –

+0

那麼,在這種情況下,你的第一個查詢帶有一個額外的'select min(unused)from('在開始時應該做這個工作(你必須添加一個條件爲<= 14,但我會留給你),你可以添加'insert into playerposition(position_id)select ...',但是如果所有的值都被填充了,你就不能輕鬆地回顯。當然,如果這是你的實際任務,但這取決於你的決定。 – Solarflare

回答

0

下面的代碼幫助我實現我想要的結果幫。我相信可以改進代碼,使代碼更好

if (mysqli_num_rows($resultCheckPos) == 14) { 
     echo "You can only have 14 positions in total"; 
    } else { 
     $testQ = "SELECT min(unused) AS unused 
FROM (
    SELECT MIN(t1.position_id)+1 AS unused 
    FROM playerposition AS t1 
    WHERE NOT EXISTS (SELECT * FROM playerposition AS t2 WHERE t2.position_id = t1.position_id+1) 
    UNION 
    -- Special case for missing the first row 
    SELECT 1 
    FROM DUAL 
    WHERE NOT EXISTS (SELECT * FROM playerposition WHERE position_id = 1) 
) AS subquery"; 

     $resultTest = $conn->query($testQ); 
     $rowTest = mysqli_fetch_assoc($resultTest); 
     $row = $rowTest['unused']; 

     $insertTest = "INSERT INTO playerposition (position_id, position_descr) VALUES ('$row','$posDesc')"; 
     $resultInsertTest = $conn->query($insertTest); 
     header("Refresh:0"); 
    }