1

、、、のテーブルがusersありinductionsますuser_inductions

  • usersテーブルにはとがidありname
  • inductionsテーブルにはとがidありname
  • user_inductions持っていたiduser_idそしてinduction_id

すべての誘導とそれを行った人々のリストを返したいと思います。ただし、以下のようなテーブルを作成したいので、これを実行しました。クエリの編集方法がわからないので、必要に応じて情報を取得します。

------------------------------------------------------------------------------------
| name    | tennis | cricket | rugby | squash | football | Table tennis |   etc    |
------------------------------------------------------------------------------------
| Bob     |   0    |   1     |   0   |    1   |    1     |     0        |          |
------------------------------------------------------------------------------------
| paul    |   1    |   1     |   1   |    1   |    0     |     0        |          |
------------------------------------------------------------------------------------

データをループして、上部に誘導のリストを表示し、各ユーザーがその主題で誘導されている場合は1、そうでない場合は0で下がっていきます。いくつかのクエリがありましたが、それらは、実行した誘導のみを持つすべてのユーザー、または誘導とそれらを実行したユーザーのいずれかのみを返します。

例えば:

SELECT CONCAT(  `f_name` ,  ' ',  `l_name` ) AS user, GROUP_CONCAT( pmainductions.name
ORDER BY pmainductions.id ) AS induction
FROM users
LEFT JOIN pmainduction_user ON users.id = pmainduction_user.user_id
LEFT JOIN pmainductions ON pmainductions.id = pmainduction_user.pmainduction_id
GROUP BY users.id

これは生成します

bob | cricket,squash,football

paul| tennis,cricket,rugby,squash

どんな助けでもいただければ幸いです。ありがとう :)

4

1 に答える 1

2

これを試して:

SELECT 
  CONCAT(  `f_name` ,  ' ',  `l_name` ) AS user, 
  MAX(CASE WHEN pmainductions.name = 'tennis' THEN 1 ELSE 0 END) AS 'tennis',
  MAX(CASE WHEN pmainductions.name = 'cricket' THEN 1 ELSE 0 END) AS 'cricket',
  MAX(CASE WHEN pmainductions.name = 'rugby' THEN 1 ELSE 0 END) AS 'rugby',
  ...
FROM users
LEFT JOIN pmainduction_user ON users.id         = pmainduction_user.user_id
LEFT JOIN pmainductions     ON pmainductions.id = pmainduction_user.pmainduction_id
GROUP BY users.id;

ユーザーごとに不明な数の誘導があり、これを動的に実行したい場合は、次のように実行できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(p.Name = ''',
      p.Name, ''', 1, 0)) AS ', '''',   p.Name , '''')
  ) INTO @sql
FROM users u
LEFT JOIN user_inductions up ON u.id = up.user_id
LEFT JOIN inductions      p ON p.id = up.induction_id;

SET @sql = CONCAT('SELECT u.name AS user,' ,
                  @sql, ' FROM users u ',
                  ' LEFT JOIN user_inductions up ',
                  ' ON u.id = up.user_id',
                  ' LEFT JOIN inductions      p     ',
                  ' ON p.id = up.induction_id ',
                  ' GROUP BY u.id');
SELECT @sql;

prepare stmt 
FROM @sql;

execute stmt;

SQLフィドルデモ

これにより、次のようなものが得られます。

| USER | TENNIS | CRICKET | RUGBY | SQUASH | FOOTBALL | TABLE TENNIS | TWO WORDS |
----------------------------------------------------------------------------------
|  bob |      1 |       1 |     1 |      1 |        1 |            0 |         0 |
| paul |      1 |       1 |     1 |      1 |        1 |            1 |         1 |
于 2013-01-06T09:06:46.420 に答える