使用:PHP,MySQL
案例:用户可以在新闻系统中添加/编辑/删除类别。有一个主用户也可以添加/编辑/删除类别。主用户添加的类别也将显示在"基本"用户的类别列表中。"基本"用户应该能够添加类别并更改其类别和主用户类别的位置,以便创建自己的类别列表。
现在我有以下表格(基本示例):
table: users {
id,
name
}
table: categories
{
id,
user_id,
title,
position
}
当在"基本"用户的页面上显示列表时,我会这样做:
SELECT title
FROM categories
WHERE user_id = #BASIC_USER_ID OR user_id = #MAIN_USER_ID
ORDER BY position
我如何才能让"基本"用户使用位置列创建自己的排序顺序。我需要不同的列/表吗?别忘了,类别可以在数百个用户之间共享,所以当添加一个新类别作为主要用户时,我不想更新数百个表,这样所有"基本"用户的列表中也都有该类别。它应该在飞行中保持位置等
提前感谢您的帮助!
我想你想:
使用position列设置一个INT值来表示其顺序,并且只有"基本用户"结果才应该在查询中使用它?
如果是这样,您可以在$var中向SQL查询添加一个条件。。。
$orderQ = (BASIC_USER_ID !=false) ? "ORDER BY position" : "";
SELECT title FROM categories WHERE user_id = BASIC_USER_ID OR user_id = MAIN_USER_ID $orderQ
这样的事情可能会奏效。。
但是,如果您希望每个用户都有自己独特的排序,我会添加一个新表:
user_id,position,item_id
使用该表来确定用户的排序值,如果为空,则可能恢复为默认值。
table: users {
id,
name
}
table: categories
{
id,
user_id,
title,
position // revert to for default
}
table: positions
{
user_id,
position,
category_id
}
如果你想允许的不仅仅是职位,为什么要复制更多的类别表,并用它来存储对类别表的个人引用;扩展位置表以包括用户标题选择等…
表格:
用户:
+-------+----------------------+
| id | name |
+-------+----------------------+
| 1 | "Admin" |
+-------+----------------------+
| 2 | "Blue User" |
+-------+----------------------+
| 3 | "Red User" |
+-------+----------------------+
类别:
+-------+----------------------+-------------+
| id | title | created_by |
+-------+----------------------+-------------+
| 1 | "Category 1" | 1 |
+-------+----------------------+-------------+
| 2 | "Category 2" | 1 |
+-------+----------------------+-------------+
| 3 | "Category 3" | 1 |
+-------+----------------------+-------------+
user_category:
+---------+--------------+-----------+--------------------+
| user_id | category_id | position | custom_title |
+---------+--------------+-----------+--------------------+
| 1 | 1 | 1 | NULL |
+---------+--------------+-----------+--------------------+
| 1 | 2 | 2 | NULL |
+---------+--------------+-----------+--------------------+
| 1 | 3 | 3 | NULL |
+---------+--------------+-----------+--------------------+
| 2 | 1 | 3 | "Red Category 1" |
+---------+--------------+-----------+--------------------+
| 2 | 2 | 2 | "Red Category 2" |
+---------+--------------+-----------+--------------------+
| 2 | 3 | 1 | "Red Category 3" |
+---------+--------------+-----------+--------------------+
| 3 | 1 | 2 | "Blue Category 1" |
+---------+--------------+-----------+--------------------+
| 3 | 2 | 1 | "Blue Category 2" |
+---------+--------------+-----------+--------------------+
| 3 | 3 | 3 | "Blue Category 3" |
+---------+--------------+-----------+--------------------+
为用户选择类别:
select c.title, uc.custom_title from category c join user_category uc on c.category_id=uc.category_id where uc.user_id= ? order by uc.position
如果uc.custom_title不为空,则显示该标题,否则显示c.title。
职位故事是我想的,但当主用户添加新类别时,我仍然有问题。子用户还没有定位项目,我不想更新数百行。我现在使用这个MySQL函数解决了这个位置问题:
IFNULL(subuser_position, default_position) AS position_temp
如果subuser_position为NULL,则回退到default_position