0

データベースに 2 つの mySQL テーブルがあります

トレーニング:

+-------------+------------+------------+------------+-...-+------------+
| Training_ID | 09-06-2012 | 16-06-2012 | 23-06-2012 | ... | 28-12-2013 |
+-------------+------------+------------+------------+-...-+------------+
|     1       |    123     |    924     |   367      |     |   679      |
+-------------+------------+------------+------------+-...-+------------+
|     2       |    243     |    626     |   381      |     |   771      |
+-------------+------------+------------+------------+-...-+------------+
|     3       |    766     |    826     |   956      |     |   725      |
+-------------+------------+------------+------------+-...-+------------+

ユーザー:

+---------+----------+
| User_ID | Name     |
+---------+----------+
|   123   | Fred     | 
+---------+----------+
|   924   | James    | 
+---------+----------+ 
|   367   | Tim      | 
+---------+----------+
|   766   | Mark     | 
+---------+----------+

私が示したいのは:

+-------------+------------+-------------+------------+-...-+------------+
| Training_ID | 09-06-2012 | 16-06-2012  | 23-06-2012 | ... | 28-12-2013 |
+-------------+------------+-------------+------------+-...-+------------+
|     1       | 123 - Fred | 924 - James | 367 - Tim  |     | 679 - Ben  |
+-------------+------------+-------------+------------+-...-+------------+
|     2       | 243 - Sarah| 626 - Smith | 381 - Exam |     | 771 - John |
+-------------+------------+-------------+------------+-...-+------------+
|     3       | 766 - Mark | 826 - Jone  | 956 - Case |     | 725 - Brett|
+-------------+------------+-------------+------------+-...-+------------+

注:実際には 70 列あります (すべて上記と同じ形式です)。

結合を使用してみましたが、列ごとに結合できません。

テーブル全体に結合を適用する方法はありますか?

4

1 に答える 1

3

これはひどい設計のように見えます。目的のフォーマットを生成するために実行するクエリも同様に恐ろしいものに見えますが、不可能ではありません。

あなたができることは、trainingusersテーブルの単一のデカルト結合を作成し、次にGROUP BYtraining_id作成し、すべてを ごとに 1 つの行に配置する一連の条件付き集計を作成することtraining_idです。

SELECT
    a.training_id,
    MAX(CASE WHEN a.`09-06-2012` = b.user_id THEN CONCAT(a.`09-06-2012`, ' - ', b.name) END) AS `09-06-2012`,
    MAX(CASE WHEN a.`16-06-2012` = b.user_id THEN CONCAT(a.`16-06-2012`, ' - ', b.name) END) AS `16-06-2012`,
    MAX(CASE WHEN a.`23-06-2012` = b.user_id THEN CONCAT(a.`23-06-2012`, ' - ', b.name) END) AS `23-06-2012`,
    MAX(CASE WHEN a.`28-12-2013` = b.user_id THEN CONCAT(a.`28-12-2013`, ' - ', b.name) END) AS `28-12-2013`
FROM training a
CROSS JOIN users b
GROUP BY a.training_id

MAX(CASE WHENテーブル内の列と同じ数の ...SELECT句が必要になります。

usersこれも見苦しく見えるかもしれませんが、列ごとに 70 回テーブルを結合するよりもはるかに効率的です。


わずか 4 列のSQLFiddle デモ

于 2012-07-20T05:47:06.943 に答える