如何对多个用户插入到同一表中不同位置的列表进行排序


How to order/sort a list where multiple users insert into different positions in the same table?

使用: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