簡體   English   中英

使用SQL根據單個記錄的更改對多個記錄進行更改

[英]Making changes to multiple records based on change of single record with SQL

我有一張食物表。 他們有一個“位置”字段,表示應該在列表中顯示的順序(listID是他們所在的列表,我們不想對另一個列表上的項目重新排序)。

+--id--+--listID--+---name---+--position--+
|   1  |     1    | cheese   |      0     |
|   2  |     1    | chips    |      1     |
|   3  |     1    | bacon    |      2     |
|   4  |     1    | apples   |      3     |
|   5  |     1    | pears    |      4     |
|   6  |     1    | pie      |      5     |
|   7  |     2    | carrots  |      0     |
| 8,9+ |    3,4+  | ...      |     ...    |
+------+----------+----------+------------+

我希望能夠說出“將梨移到切屑之前”,這涉及將梨的位置設置為位置1,然后將其之間的所有位置增加1。

+--id--+--listID--+---name---+--position--+
|   1  |     1    | cheese   |      0     |
|   2  |     1    | chips    |      2     |
|   3  |     1    | bacon    |      3     |
|   4  |     1    | apples   |      4     |
|   5  |     1    | pears    |      1     |
|   6  |     1    | pie      |      5     |
|   7  |     2    | carrots  |      0     |
| 8,9+ |    3,4+  | ...      |     ...    |
+------+----------+----------+------------+

這樣,我需要做的就是SELECT name FROM mytable WHERE listID = 1 ORDER BY position然后我將按照正確的順序獲取所有食物。

是否可以通過單個查詢執行此操作? 請記住,一條記錄可能在列表中上移或下移,並且該表包含多個列表的記錄,因此我們需要隔離listID。

我對SQL的了解非常有限,所以現在我唯一知道的方法是SELECT id, position FROM mytable WHERE listID = 1 AND position BETWEEN 1 AND 5然后可以使用Javascript(node.js)更改位置5到1,所有其他+1遞增。 然后更新我剛剛更改的所有記錄。

只是在我每次嘗試閱讀SQL內容時,每個人都一直在說以避免多種查詢,並避免進行同步編碼和類似的事情。

謝謝

這需要更新許多記錄的復雜查詢。 但是,對數據進行小的更改可能會改變事情,因此可以通過僅修改一條記錄的簡單查詢來實現。

UPDATE my_table set position = position*10;

在過去,許多系統上的BASIC編程語言都有行號,因此鼓勵使用spagetti代碼。 許多人寫了GOTO line_number而不是函數。 如果您按順序對行進行編號並且必須添加或刪除幾行,則會出現真正的麻煩。 人們如何解決它? 通過增加10行! 這就是我們在這里所做的。

因此,您想讓梨成為第二項嗎?

UPDATE my_table set position = 15 WHERE listId=1 AND name = 'Pears'

擔心最終物品之間的間隙會在多次重新排序后消失嗎? 無所畏懼

UPDATE my_table set position = position*10;

時。

我不認為可以用少於兩個查詢來方便地完成此操作,這是可以的,應該盡可能少地查詢,但不惜一切代價。 這兩個查詢就像(根據您自己編寫的內容)

UPDATE mytable SET position = 1 WHERE listID = 1 AND name = 'pears';
UPDATE mytable SET position = position + 1 WHERE listID = 1 AND position BETWEEN 2 AND 4;

我基本上已經解決了我的問題。 因此,我決定在這里回答,以防萬一有人覺得有幫助。 我可以在SQL中使用CASE語句。 同樣,通過預先使用Javascript構建我的SQL查詢,我可以更改多個記錄。

這將構建我的SQL查詢:

var sql;
var incrementDirection = (startPos > endPos)? 1 : -1;
sql = "UPDATE mytable SET position = CASE WHEN position = "+startPos+" THEN "+endPos;
for(var i=endPos; i!=startPos; i+=incrementDirection){
    sql += " WHEN position = "+i+" THEN "+(i+incrementDirection);
}
sql += " ELSE position END WHERE listID = "+listID;

如果要將梨移到Chips之前。 我可以設置:

startPos = 4;
endPos = 1;
listID = 1;

我的代碼將產生一個如下的SQL語句:

UPDATE mytable
SET position = CASE
  WHEN position = 4 THEN 1
  WHEN position = 1 THEN 2
  WHEN position = 2 THEN 3
  WHEN position = 3 THEN 4
  ELSE position
END
WHERE listID = 1

我運行該代碼,我的最終表將如下所示:

+--id--+--listID--+---name---+--position--+
|   1  |     1    | cheese   |      0     |
|   2  |     1    | chips    |      2     |
|   3  |     1    | bacon    |      3     |
|   4  |     1    | apples   |      4     |
|   5  |     1    | pears    |      1     |
|   6  |     1    | pie      |      5     |
|   7  |     2    | carrots  |      0     |
| 8,9+ |    3,4+  | ...      |     ...    |
+------+----------+----------+------------+

之后,我所要做的就是SELECT name FROM mytable WHERE listID = 1 ORDER BY position運行SELECT name FROM mytable WHERE listID = 1 ORDER BY position ,輸出將如下所示:

cheese
pears
chips
bacon
apples
pie

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM