1

さて、4 つのテーブル、users、events、event_roles、user_event_role を持つクエリを実行しようとしています。

ユーザーは複数の役割を担うことができます。私がやろうとしているのは、次のような結果を得ることです:ユーザー、イベント、ロール

したがって、ユーザー 'Bill' がイベント 'Meeting' に関連付けられており、'Bill' が次のような結果を得る代わりに複数の役割を果たしている場合:

user   event     role
--------------------------
bill   Meeting   admin
bill   Meeting   director

どうすれば私の結果がこのようになりますか

user   event     role    role
----------------------------------
bill   Meeting   admin   director

これは、私が構築しようとしているクエリです。

Select * 
  FROM `users` u 
LEFT JOIN `event_role` er ON u.user_id = er.user_id 
LEFT JOIN `events` e ON er.event_id = e.event_id
4

3 に答える 3

3

あなたが求める結果は不可能です。

ただし、近いものがあります。

SELECT
  user,
  event,
  group_concat(role SEPARATOR ',') as roles
FROM
  `users` u 
  LEFT JOIN `event_role` er
    ON u.user_id = er.user_id 
  LEFT JOIN `events` e
    ON er.event_id = e.event_id
GROUP BY u.user_id

これは次のようになります。

user   event     roles
----------------------
bill   Meeting   admin,director

いずれの場合も、正しく解析するためにロジックを調整する必要があります。

于 2013-02-09T21:53:36.253 に答える
1

ロールがいくつあるのか (つまり、列の数) がわからないため、このような結果は得られませんが、GROUP_CONCATその方法を使用できます。

SELECT *,
GROUP_CONCAT(event_roles.role SEPARATOR ',') as roles
FROM users
LEFT JOIN event_role USING(user_id)
LEFT JOIN events USING(user_id)
GROUP BY user_id

このクエリを使用すると、 で連結されたすべてのロールを取得できます,。ただし、 の制限に注意してください。GROUP_CONCATデフォルト値は 1024 文字に設定されているため、十分でない可能性があります (「 」を参照my.cnf)。

于 2013-02-09T21:56:34.920 に答える
0

このようにGroup_concat ( http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html ) を使用します。それを簡単に示すために、Ben Forta による優れた MySQL 入門書 ( http://www.forta.com/books/0672327120/ ) のデータベースを使用しています。所属はありません。

SELECT v.vend_id, GROUP_CONCAT(p.prod_id)
FROM products p 
JOIN  vendors v ON v.vend_id= p.vend_id
JOIN  orderitems oi ON oi.prod_id = p.prod_id
GROUP BY v.vend_id;
于 2013-02-09T22:15:29.503 に答える