1

MySQL に 2 つのテーブルがあります。

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、チェックされたロールを持つ配列があります。

大工、配管工、ヘアスタイリストのいずれかの役割を持つユーザーを検索するためにデータベースにクエリを実行するにはどうすればよいですか?

更新:これが私が思いついたクエリです:

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」(あなたが持っているように)、user_roles(あなたが持っているように)、そして2つをリンクするuser_idとrole_idを含む「user_roles_link」です。

特定のロールに属するユーザーを取得するには、主にデータを取得するテーブル(この場合は「users」)から始めて、user_idをuser_role_linkテーブルに「結合」し、そこからuser_roleテーブル(role_idによってリンクされています)。role_nameによって(WHERE)を制限します。

lanzzが言ったように、実際にはソリューション全体を作成しているだけですが、それでアプローチを理解するのに十分なはずです。


編集:そのビットが機能するようになったら(つまり、JOINS)、インデックスをチェックアウトすることを忘れないでください。それらを速くするために関係(結合)で重要です。

于 2012-07-01T12:58:05.613 に答える
1

これを行うためのより良い方法は、rolesというテーブルを追加することです。

テーブルの役割

  1. ID
  2. 役割

次に、ユーザーを役割にマップするための別のテーブルを用意します

テーブルUser_Roles列

  1. ユーザーID
  2. Role_ID

User_Rolesテーブルは、次のように、ユーザーの複数のロールを格納できます。

User_ID RoleID 1 2 1 4

次に、クエリでいくつかの結合魔法を使用できます。質問がかなり広いので、私はより精巧な答えを提供することはできませんが。

于 2012-07-01T13:16:13.630 に答える