我有下表:
+-----------+--------------+
|categoryID | categoryName |
+-----------+--------------+
| 0 | Bills |
| 1 | Gas |
| 2 | Coffee |
| 3 | Restaurants |
+-----------+--------------+
我的所有用户都可以访问此表,但是,用户希望能够对表格进行排序(不一定按字母顺序或顺序排列),并保存其排序顺序首选项。他们还想隐藏他们不使用的类别。
例如:
用户1希望他们的表看起来像这样:
+-----------+--------------+
|categoryID | categoryName |
+-----------+--------------+
| 3 | Restaurants |
| 0 | Bills |
| 1 | Gas |
+-----------+--------------+
用户2希望他们的表看起来像这样:
+-----------+--------------+
|categoryID | categoryName |
+-----------+--------------+
| 0 | Bills |
| 1 | Gas |
| 2 | Coffee |
+-----------+--------------+
用户3希望他们的表看起来像这样:
+-----------+--------------+
|categoryID | categoryName |
+-----------+--------------+
| 3 | Restaurants |
| 1 | Gas |
| 0 | Bills |
| 2 | Coffee |
+-----------+--------------+
我能想到的唯一方法就是创建一个像这样的表:
+-------+---------+
|userID | sort |
+-------+---------+
| 1 | 3,0,1 |
| 2 | 0,1,2 |
| 3 | 3,1,0,2 |
+-------+---------+
问题:我被告知在列中存储CSV列表不是一个好习惯,但我不知道如何实现这一点。如何在不在列中存储CSV列表的情况下完成我想要的工作?
答案 0 :(得分:0)
您可以实现此目的的另一种方法是使用user_id,category_id,order组成排序表 订单将在此之后存储1个最高类别2类别的订单,依此类推。
user_id | category_id | order
1 | 2 | 1
1 | 3 | 2
答案 1 :(得分:0)
不要在数据库中存储分隔值,因为您无法正常维护和查询数据。
而是创建多对多表(我们称之为user_categories),这可能看起来像这样
CREATE TABLE user_categories
(
`userid` int,
`categoryid` int,
`sort_order` int,
primary key (userid, categoryid),
foreign key (userid) references users (userid),
foreign key (categoryid) references categories (categoryid)
);
问题中提到的三个用户的示例内容将如下所示
| USERID | CATEGORYID | SORT_ORDER | |--------|------------|------------| | 1 | 3 | 1 | | 1 | 0 | 2 | | 1 | 1 | 3 | | 2 | 0 | 1 | | 2 | 1 | 2 | | 2 | 2 | 3 | | 3 | 3 | 1 | | 3 | 1 | 2 | | 3 | 0 | 3 | | 3 | 2 | 4 |
然后你可以做
SELECT c.categoryid, c.categoryname
FROM user_categories uc JOIN categories c
ON uc.categoryid = c.categoryid
WHERE userid = 1
ORDER BY uc.sort_order
示例输出:
| CATEGORYID | CATEGORYNAME | |------------|--------------| | 3 | Restaurants | | 0 | Bills | | 1 | Gas |
这是 SQLFiddle 演示