0

我的数据库中有两个 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

这看起来像一个糟糕的设计,您要执行以生成所需格式的任何查询也会看起来同样可怕,但这并非不可能:

您可以做的是对trainingandusers表进行单个笛卡尔连接,然后GROUP BYtraining_id, 进行一组条件聚合,将所有内容放在一行中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 WHENSELECT

users虽然这看起来也很丑陋,但它比为每列加入 70 次不同时间的表要高效得多。


只有四列的SQLFiddle 演示

于 2012-07-20T05:47:06.943 回答