我有一個'用戶'表中的MySQL基於ID列表的特定記錄排序?與MySQL和PHP
當用戶登錄到我的應用程序,他們可以看到所有其他用戶的列表,出現在我們想要保存該訂單。
它被保存到它們的記錄(即'order_pref'= 4,3,5,23 ... user_ids列表按照它們指定的順序)。
所以這很好,但當涉及到顯示..有沒有一種簡單的方法,我可以使用只有一個查詢基於這個逗號分隔的user_ids列表進行排序?
我有一個'用戶'表中的MySQL基於ID列表的特定記錄排序?與MySQL和PHP
當用戶登錄到我的應用程序,他們可以看到所有其他用戶的列表,出現在我們想要保存該訂單。
它被保存到它們的記錄(即'order_pref'= 4,3,5,23 ... user_ids列表按照它們指定的順序)。
所以這很好,但當涉及到顯示..有沒有一種簡單的方法,我可以使用只有一個查詢基於這個逗號分隔的user_ids列表進行排序?
你不能在MySQL中。可以想象,你可以在PHP中,但這不是模擬此問題的最佳方式。
您應該分配一個訂單號,然後按該訂單號進行排序,而不是按照固定順序存儲這些ID。假設:
您存儲:
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),可能需要非常偶爾重新編號這些值。
有幾種方法可以做到這一點,最好的情況是使用第二個表進行用戶特定的排序。假設每個用戶都有自己的訂單,向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;
這需要更高級的工具來保持您的架構是最新的,但它會更好地擴展。