2015-12-31 67 views
0

假設我有一個表,表:我怎麼能在PHP中執行這個基本的表查詢?

NAME ID ... 
m -1 ... 
f -1 ... 
g -1 ... 
b -1 ... 
z -1 ... 

而且我希望把它變成:

NAME ID ... 
f  1 ... 
g  2 ... 
m  3 ... 
b -1 ... 
z -1 ... 

你可能得到的想法:

  1. 選擇第3行從原始表格(保留順序)
  2. 按NAME對選定的行進行排序列。
  3. 更新選定的行ID與他們在新表中的位置(保持其餘未選中的行在其原始位置)。

所以​​得到了排序,以(f, g, m)(b, z)保持(b, z)

以下是我正在試圖做到這一點在PHP中:

$count = 0; 
$query = "UPDATE TABLE SET ID = $count:= $count + 1 ORDER by NAME DESC LIMIT 3"; 
mysqli_query($con, $query); 

但我不認爲我可以先走一步,計數器加存儲這樣它的價值。有什麼建議?

+0

您總是可以使用select查詢來查詢前3行並獲取名稱只是因爲ID目前是不相關的。然後使用'sort()'函數對數組進行排序。完成之後,調用'array_values()'方法重新綁定數組鍵。現在,您可以使用循環來構建查詢。 – kfirba

回答

0

你可以試試這個:

$limit = 3; 
for($count = 0 ; $count < $limit;$count++){ 
$query = "UPDATE TABLE SET ID = $count + 1 WHERE ID = '-1' ORDER by NAME DESC"; 
mysqli_query($con, $query); 
} 
$query = "UPDATE TABLE SET ID = '-1' WHERE ID > $limit ORDER by NAME DESC"; 
mysqli_query($con, $query); 

在上面的邏輯:

在最後的循環中,所有的ID都設置爲$限制 然而outisde循環更新命令將重新設置標識再次爲-1

0

首先,您可以快速查詢表中的前3行並僅獲取name屬性並將值分配給數組。

$sql = "select name from table order by name limit 3" 
$query = $mysqli->query($sql); 

現在,讓我們構建一個輔助的數組:

while ($row = $mysqli->fetch_assoc()) { 
    $a[] = $row['name']; 
} 

現在只是結構查詢:

foreach($a as $id => $name) { 
    $query = "update table set id={$id+1} where name='$name' limit 1"; 
    // execute the query 
} 

請注意,我假設名稱是唯一的,所以我說的limit 1指令告訴它一旦找到一行就停止查找要更新的行。

此外,不要忘記,數組鍵從0開始計數,因此我們在循環中將$ id加1。

可能有更多優雅的解決方案,但這個相當容易理解和使用。

0

在MySQL:

SET @row_number = 0; 

update TABLE d 
join 
    (
    select 
      NAME, 
      @row_number:[email protected]_number+1 as ID, 
    from 
      (select NAME from TABLE limit 3) t 
    order by 
      NAME asc 
    ) s on s.NAME = d.NAME 
set d.ID = s.ID; 

SQLFiddle:http://sqlfiddle.com/#!9/dffecf/1

這是假設,NAME是你唯一的密鑰,否則可能最好在你的表中的標識列替換並利用它來進行更新。

此方法可能需要根據您的數據庫引擎進行一些語法更改。通過在SQL中執行此操作,我們只需在數據庫中進行一次傳遞。如果你只更新三條記錄,但是如果它是1000等,那麼用PHP進行多次遍歷的代價並不是很大。