2012-02-03 44 views
1

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

哪有我使它成为一个“基本”用户可以使用位置列创建自己的排序顺序。我需要不同的列/表格吗?不要忘记,数百个用户可以共享类别,因此当添加新类别作为主用户时,我不想更新数百个表格,因此所有“基本”用户也都在其列表中拥有类别。它应该在飞行中维护位置等。

谢谢您的帮助提前!

+0

所以将基本用户的类别永远是一个主要的用户类别的子集,或将两者用户类型包含所有相同的类别,但顺序不同?此外,是否所有基本用户都只与一个主用户相关联? – ggreiner 2012-02-03 00:28:37

回答

0

我想你想:

使用位置栏设置一个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,位置,ITEM_ID

使用该表来确定用户的排序值,如果为空,恢复为默认值也许。

table: users { 
      id, 
      name 
     } 

table: categories 
     { 
      id, 
      user_id, 
      title, 
      position  // revert to for default 
      } 
table: positions 
     { 
      user_id, 
      position, 
      category_id 
     } 
如果你想允许不仅仅是位置,为什么复制更多的类别表,并用它来存储的类别表中的个人引用的更多

;延伸位置表以包括所述用户选择标题等....

0

表:

用户:

+-------+----------------------+ 
| 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。

0

位置故事是我想到的,但当主用户添加新类别时仍然存在问题。子用户没有定位该项目,我不想更新数百行。我现在解决了使用此MySQL的功能,这个位置问题:

IFNULL(subuser_position, default_position) AS position_temp 

在DEFAULT_POSITION回落,如果subuser_position是NULL

相关问题