2010-03-16 79 views
0

我有一個'用戶'表中的MySQL基於ID列表的特定記錄排序?與MySQL和PHP

當用戶登錄到我的應用程序,他們可以看到所有其他用戶的列表,出現在我們想要保存該訂單。

它被保存到它們的記錄(即'order_pref'= 4,3,5,23 ... user_ids列表按照它們指定的順序)。

所以這很好,但當涉及到顯示..有沒有一種簡單的方法,我可以使用只有一個查詢基於這個逗號分隔的user_ids列表進行排序?

回答

0

你不能在MySQL中。可以想象,你可以在PHP中,但這不是模擬此問題的最佳方式。

您應該分配一個訂單號,然後按該訂單號進行排序,而不是按照固定順序存儲這些ID。假設:

  • 登錄的用戶是302
  • 用戶ID列表是11,432,788,343

您存儲:

UserID OrderNum UserDisplay 
302  100  11 
302  200  432 
302  300  788 
302  400  343 

然後問題變爲:

SELECT UserDisplay 
FROM UserOrder 
WHERE UserID = 302 
ORDER BY OrderNum 

很多更簡單。現在更改訂單需要更新OrderNum字段。這就是爲什麼我沒有做1的步驟。相反,我做了100的步驟,所以如果你想將343移動到第二位,只需將OrderNum設置爲150.你可能會做更大的間隔(例如1000000),可能需要非常偶爾重新編號這些值。

0

有幾種方法可以做到這一點,最好的情況是使用第二個表進行用戶特定的排序。假設每個用戶都有自己的訂單,向User表中添加單列將不起作用。

根據應用程序的規模和複雜程度,您可以使用單個表(更易於管理,但數百萬用戶較慢)執行此操作,或爲每個用戶(更具可擴展性)創建表。在以下示例中,當前用戶是用戶#2,排序爲4,3,5,23。

create table if not exists user_ordering (
    owner_id integer unsigned not null, 
    user_id integer unsigned not null, 
    order_index integer not null default '0', 
    unique owner_user (user_id,owner_id), 
    index owner_idx (owner_id,order_index) 
) ENGINE=MyISAM; 

要保存排序,依次插入:

INSERT INTO user_ordering (owner_id,user_id,order_index) VALUES (2,4,0); 
INSERT INTO user_ordering (owner_id,user_id,order_index) VALUES (2,3,1); 
INSERT INTO user_ordering (owner_id,user_id,order_index) VALUES (2,5,2); 
INSERT INTO user_ordering (owner_id,user_id,order_index) VALUES (2,23,3); 

要選擇,快快加入,而不是在列表中使用 「默認」 之類的用戶:

SELECT U.* FROM user U 
LEFT OUTER JOIN user_ordering G ON U.id=G.user_id AND G.owner_id=2 
ORDER BY G.order_index,U.name; 

如果您想要節省一些時間,您可以使用帶自動遞增功能的雙主鍵來使增量發生在「所有者 - 所有者」的基礎上,例如

create table if not exists user_ordering (
    owner_id integer unsigned not null, 
    user_id integer unsigned not null, 
    order_index integer not null AUTO_INCREMENT, 
    unique owner_user (user_id,owner_id), 
    PRIMARY KEY (owner_id,order_index) 
) ENGINE=MyISAM; 

如果給你一個清單進行更新,你可以做快速和髒:

DELETE FROM user_ordering WHERE owner_id=2; 
INSERT INTO user_ordering (owner_id,user_id) VALUES (2,4); 
INSERT INTO user_ordering (owner_id,user_id) VALUES (2,3); 
INSERT INTO user_ordering (owner_id,user_id) VALUES (2,5); 
INSERT INTO user_ordering (owner_id,user_id) VALUES (2,23); 

您甚至可以使用多插入的版本:

DELETE FROM user_ordering WHERE owner_id=2; 
INSERT INTO user_ordering (owner_id,user_id) VALUES (2,4),(2,3),(2,5),(2,23); 

對於龐大的數據庫,你可以做的更好,以每個用戶創建一個表,如:

create table if not exists user_ordering_2 (
    user_id integer unsigned not null, 
    order_index integer not null AUTO_INCREMENT, 
    unique owner_user (user_id), 
    PRIMARY KEY (order_index) 
) ENGINE=MyISAM; 

這需要更高級的工具來保持您的架構是最新的,但它會更好地擴展。