2011-11-02 97 views
0

我有一個MySQL數據庫和一些PHP,允許您在數據庫中創建一個條目,更新條目,並查看條目作爲網頁或XML。我想要做的是添加一個函數,將數據庫中的條目向上或向下移動一行,或發送到數據庫頂部或底部。移動一個MySQL數據庫上移或下移用PHP

我看過一些關於做這種類型的事情的在線評論,建議在顯示頁面時進行動態排序,但我正在尋找一個持久的度假村。我已經看到了一種方法,建議在數據庫中有一個獨立於實際數據庫排序關鍵字的單獨「排序」字段,但我不確定爲什麼這樣做比實際重新排序數據庫要好得多

下面是表結構的轉儲:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 

-- 
-- Database: `hlnManager` 
-- 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `hln_stations` 
-- 

CREATE TABLE IF NOT EXISTS `hln_stations` (
    `id` int(6) NOT NULL auto_increment, 
    `station_title` varchar(60) NOT NULL default '', 
    `station_display_name` varchar(60) NOT NULL default '', 
    `station_subtitle` varchar(60) NOT NULL default '', 
    `station_detailed_description` text NOT NULL, 
    `stream_url_or_playlist_url` text NOT NULL, 
    `link_type` varchar(25) NOT NULL default '', 
    `small_thumbnail_graphic_url` text NOT NULL, 
    `large_thumbnail_graphic_url` text NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id` (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=21 ; 
+0

你回答了你自己的問題 - 使用按字段排序。數據庫密鑰旨在成爲唯一標識符,並且將其含義超載將在稍後導致項目中出現問題。 – hafichuk

+0

改變獨特的身份證會導致我未來會出現什麼問題? – alphablender

+0

@alphablender你永遠無法以任何形式的一致性來引用特定的記錄,因爲可以想象其他領域在某些時候可能會變得可編輯,因爲它們是「面向公衆」的。 – dqhendricks

回答

3

不確定「重新排序」數據庫的含義...... SQL數據庫通常不會保證它們將以什麼順序(如果有的話)在ORDER BY子句之後返回記錄。

  1. 您需要一個「SortOrder」類型的列。我建議你用一個唯一的關鍵字來表示它。
  2. 您需要一種方法通過UI

易於編程,方便使用來更新這個「SortOrder的」列:使用jQuery或任何JavaScript庫的作品爲實現一個簡單的拖拽+拖放界面在HTML您。在on-complete方法中(或者對保存按鈕作出響應),觸發一個ajax調用,它將以正確的順序發送一個數組id。在數據庫端,循環並相應地更新SortOrder,從1開始,然後等2 ...

難以編程,難以使用:實現經典的向上移動和向下移動按鈕。單擊時,發送idaction(例如,向上,向下)到服務器。有幾種策略可以處理這個更新,但我將概述一對夫婦:

假設用戶單擊「向上移動」,您可以將ID與以前的記錄交換。

查找以前的記錄:SELECT id FROM hln_stations WHERE SortOrder < (SELECT SortOrder FROM hln_stations WHERE id = ...) ORDER BY SortOrder DESC LIMIT 1

運行兩個更新語句,交換的SortOrder的。反向移動。添加特殊代碼來檢測頂部或底部。

等...

還有其他的方法,但對於一個Web界面,我建議你做拖動+下降,因爲用戶會喜歡的。

+0

好吧,只需在數據庫中添加一個Int sortorder列,手動鍵入0- 20的所有現有記錄。當我試圖使該列獨一無二時,我得到:**以下索引看起來是相同的,其中一個應該被刪除:PRIMARY,ID **所以我想嘗試實現「經典」方法,但不是確定如何在PHP中做到這一點 – alphablender

+0

@alphablender聽起來像你試圖將第二個主鍵添加到您的ID字段... – dqhendricks

3

數據庫不是「存儲」以任何順序。它們以任何便於存儲子系統的方式存儲。如果您刪除記錄,則新記錄可能會使用舊記錄的空間將其自身「插入」到數據庫中。雖然看起來數據庫總是以特定順序返回記錄,但不能依賴它。

確保排序順序的唯一方法是有一個字段進行排序。

1

「重新排序」數據庫將需要兩個記錄交換主鍵,或者很可能他們需要除主鍵之外的所有數據都被交換。這很可能是不受歡迎的,因爲主鍵應該是您可以始終引用特定記錄的一種方式。

單獨的訂單字段將是要走的路。只要確保你在訂單欄中放置了一個索引,以便事物保持快速。

1

無法找出數據庫存儲數據的順序。當我們查詢數據庫時,我們指定我們希望我們的數據按照排序的字段名稱。 在你的情況下,我會添加一個新列:sequence int(10)。並編寫php函數來更改/更新序列號。當我將使用select查詢時,我將按序號排序。

+0

我在哪裏可以找到一些這樣做的例子PHP函數?爲什麼phpMyadmin在嘗試使新的sort_order列成爲索引時抱怨?請參閱本頁底部的註釋以獲取錯誤消息。 – alphablender

2

不知道在哪裏可以找到示例來查找示例。但你可以看下面的代碼,它是非常基本的: 讓id是你的主鍵,並有一列sort_order。您想要按以下順序存儲主鍵:5,4,3,6,8,7,9,10,2,1。 那麼您將它們保存在一個數組:

$my_sorted = array(5,4,3,6,8,7,9,10,2,1); 

然後您更新表:

update `mytable` set `sort_order` = (index of $my_sorted) WHERE `id`=(array value of that index). 

而不是做很多查詢,你可以像一個查詢做到這一點:

$query = "UPDATE `mytable` SET sort_order= CASE id "; 

foreach($my_sorted as $key=>$val){ 
    $query .= " WHEN '$val' THEN $key "; 
} 
$query .="END"; 

然後你在mysql中運行$ query。

更新表格後,您可以從mytable中選擇順序排列順序排序順序或順序。

希望這有助於。