规范化数据库搜索查询

时间:2012-07-01 12:37:18

标签: php mysql

我在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`

这是实现这一目标的最佳方法吗?或者这是否会导致某些服务器过载?

2 个答案:

答案 0 :(得分:1)

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

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

正如兰兹所说,更多的是真正编写整个解决方案 - 但这应该足以让你找到方法。


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

答案 1 :(得分:1)

更好的方法是添加一个名为roles

的表

表角色

  1. ID
  2. 作用
  3. 然后有另一个表将用户映射到他们的角色

    表User_Roles 列

    1. USER_ID
    2. ROLE_ID
    3. User_Roles表将能够为用户存储多个角色,例如:

      User_ID RoleID 1 2 1 4

      然后在您的查询中,您可以使用一些joining魔法。虽然我无法提供更详细的答案,但问题相当广泛。