1

Joomla には 3 つのテーブルがあります。

ユーザー:

id | username
-------------
1  | you
2  | me

グループ:

id | title
-------------
1  | users
2  | managers

ユーザーグループ_マップ:

user_id | group_id
------------------
1       | 2
2       | 1
2       | 2

私がやりたいことは、次のようにフラット化するクエリ (そこからビューを作成する) を作成することです。

user_id | username | users | manager
------------------------------------
1       | you      | 0     | 1
2       | me       | 1     | 1

これまでのところ、次のようなものがあります。

SELECT u.id, username, group_id, user_id, title
FROM joomla_users u
  LEFT JOIN joomla_user_usergroup_map map ON map.user_id = u.id
  LEFT JOIN joomla_usergroups g ON g.id = map.group_id
WHERE title = 'Super Users'

これにより、グループ メンバーシップごとに 1 つのレコードが得られますが、usergroups_map.

意味がありますか?

4

1 に答える 1

1

グループが固定されている場合 (ユーザー、マネージャー)、次のようなものを使用できます。

SELECT
  u.id,
  u.username,
  count(case when um.group_id = 1 then 1 end) users,
  count(case when um.group_id = 2 then 1 end) manager
FROM
  user u INNER JOIN usergroups_map um
  ON u.id = um.user_id
GROUP BY
  u.id, u.username

それ以外の場合は、次のようなソリューションを使用する必要があります。

SET @sql = NULL;
SELECT GROUP_CONCAT(CONCAT('count(case when um.group_id=',id,' then 1 end) ', title))
FROM `group`
INTO @sql;

SET @sql = CONCAT('SELECT u.id, u.username, ', @sql, ' FROM
  user u INNER JOIN usergroups_map um
  ON u.id = um.user_id
GROUP BY
  u.id, u.username');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

ここでフィドルを参照してください。

ビューを作成する必要がある場合は、上記のコードを次のように変更します。

SET @sql = NULL;
SELECT GROUP_CONCAT(CONCAT('count(case when um.group_id=',id,' then 1 end) ', title))
FROM `group`
INTO @sql;

SET @sql = CONCAT('CREATE VIEW yourview AS SELECT u.id, u.username, ', @sql, ' FROM
  user u INNER JOIN usergroups_map um
  ON u.id = um.user_id
GROUP BY
  u.id, u.username');

DROP VIEW IF EXISTS yourview;

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
于 2013-02-26T22:11:30.750 に答える