SQL:来自特定项目的用户禁止列表

时间:2014-06-04 08:34:13

标签: php mysql sql

我有一张产品表:

ID, Name, Time, Creator, Owner, Size, Color, ...

我想禁止某些用户使用某些产品。我想到了2个解决方案。

1)我创建了一个包含禁止用户信息的表:

Product ID, User ID, BannedOrNot

2)为产品表添加每个用户的列。

ID, Name, Time, Creator, Owner, Size, Color, ..., User 1, User 2, User 3

如果用户被禁止使用该产品,我会添加。

我知道1解决方案更好。但是我每秒都要处理一些非常难以置信的问题。所以我想因为性能而避免许多查询。

用户未选择特定产品。该脚本会根据Size, Color等内容自动选择产品。但问题是它不知道用户是否被禁止使用此产品。

首先,解决方案需要首先从禁止列表中获取属于正在访问产品表的用户的所有数据。然后根据用户是否被禁止,从产品表中选择条目。

如果重要的话,我正在使用PHP,MySQL。

2 个答案:

答案 0 :(得分:1)

我更喜欢第一种解决方案。只为每个被禁用的用户添加一行,并将其添加到您的产品查询

在FROM子句中

LEFT JOIN banned_table ON (products.id = banned_table.producs_id 
                           AND banned_table.user_id = <current_user_id>) 

在WHERE子句中

... AND banned_table.id IS NULL 

如果存在,则只检索一行banned_table,并避免使用禁止的产品查询结果。

希望它适合你。

答案 1 :(得分:0)

您应该创建一个包含产品外键的新表:

Banned(Product -> Products, User)

您可以使用此查询创建它:

CREATE TABLE banned(product NOT NULL, user NOT NULL, FOREIGN KEY (product) REFERENCES products(id))

然后,您可以通过一个查询为单个用户获取产品:

SELECT *
FROM products

MINUS  

SELECT p.Name, p.Time, p.Creator, ..
FROM PRODUCTS p LEFT JOIN BANNED b on (p.id = b.product)
WHERE b.user ='YOURUSER'