1

我在 MySQL 中有两个表:

users

Columns:
    1. id
    2. username
    3. email
    4. password

users_roles

Columns:
    1. id
    2. user
    3. role

我将角色保存在这样的数组中:

array(
    '1' => 'Carpenter',
    '2' => 'Plumber',
    '3' => 'Hair Stylist'
)

在搜索表单中,我有上述角色及其 ID 的复选框。在表单处理脚本中,我有$roles一个具有选中角色的数组。

如何查询数据库以搜索具有 Carpenter、Plumber、Hair Stylist 角色之一的用户?

更新:这是我提出的查询:

SELECT `users`.`id` 
FROM `users`
WHERE 
    `users`.`id` IN 
    ( 
    SELECT `user` FROM `users_roles` WHERE `role` IN ( 1, 2, 3 ) 
    ) 
GROUP BY `users`.`id`

这是实现这一目标的最佳方式吗?还是这必然会导致某些服务器过载?

4

2 回答 2

1

表是“用户”(如您所见),user_roles(如您所见),然后是“user_roles_link”,其中包含链接两者的 user_id 和 role_id。

要获取属于特定角色的用户,请从您主要要从中获取数据的表(在本例中为“用户”)开始,然后将 user_id “加入”到 user_role_link 表,然后从该表进入user_role 表(由 role_id 链接)。由 role_name 限制(WHERE)。

正如 lanzz 所说,更多的事情就是编写整个解决方案——但这应该足以让你制定出方法。


编辑:当你开始工作时(即 JOINS),记得检查索引。对关系(连接)很重要,以使它们快速。

于 2012-07-01T12:58:05.613 回答
1

更好的方法是添加一个名为角色的表

表角色

  1. ID
  2. 角色

然后有另一个表将用户映射到他们的角色

表 User_Roles 列

  1. 用户身份
  2. Role_ID

User_Roles 表将能够为一个用户存储多个角色,例如:

User_ID RoleID 1 2 1 4

然后在您的查询中,您可以使用一些加入魔法。尽管我无法提供更详尽的答案,因为问题非常广泛。

于 2012-07-01T13:16:13.630 回答