将2个表与相同的列组合在一起

时间:2013-12-04 22:00:18

标签: mysql

已经遍布stackoverflow和谷歌已经接近,但还没有找到完整的解决方案......也许这是一个简单的解决方案,没有人需要在此之前寻求帮助?

我有2个课程表&课程相关信息(Master_Table& Import_Table)。 Master_Table表包含每个课程的核心内容/信息,但缺少日期&每周变化的时间(目前大约有240排核心课程)。请参阅下面的Master_Table结构:

Master_Table

+-----------+----------------+------------+------------+-------------------+------+
| sku_crmid |  post_title    | start_date | start_time |   post_content    | u_id |
+-----------+----------------+------------+------------+-------------------+------+
| skuid1    | Unique Title 1 |    null    |    null    | Unique Content 1  | null |
| skuid2    | Unique Title 2 |    null    |    null    | Unique Content 2  | null |
| skuid2    | Unique Title 3 |    null    |    null    | Unique Content 3  | null |
+-----------+----------------+------------+------------+-------------------+------+

每周更新一次Import_Table并附上新日期&时间(可能多达2000多行/导入)。它还包含post_tile ... post_title是2个表之间唯一的 ONLY 事物。虽然post_title将在Master_Table中显示一次,但它将在Import_Table中显示多次(每个新日期和时间一行)。请参阅下面的Import_Table结构:

Import_Table

+-----------+----------------+------------+------------+-------------------+------+
| sku_crmid |  post_title    | start_date | start_time |   post_content    | u_id |
+-----------+----------------+------------+------------+-------------------+------+
|   null    | Unique Title 1 | 12/02/2013 |   8:00am   |     null          | null |
|   null    | Unique Title 1 | 12/16/2013 |   8:00am   |     null          | null |
|   null    | Unique Title 2 | 12/09/2013 |   8:00am   |     null          | null |
|   null    | Unique Title 2 | 12/16/2013 |   8:00am   |     null          | null |
|   null    | Unique Title 3 | 12/02/2013 |   8:00am   |     null          | null |
|   null    | Unique Title 3 | 12/09/2013 |   8:00am   |     null          | null |
+-----------+----------------+------------+------------+-------------------+------+

我需要能够将Master_Table和Import_Table组合成一个表/输出,我可以导出到CSV。如果Import_Table中的“null”和Master_Table中的数据,我需要将“null”替换为输出中的数据。如果同一列中的两个表中都存在“null”,则“null”out为OK。

如果可能的话,下面是两个可能的输出。选项1可以正常工作,但选项2更理想。我已经看到选项2在之前的查询中插入了',',但是管道是我需要的,在'|'的任何一侧都没有空格......

需要输出 - 选项1

+-----------+----------------+------------+------------+-------------------+------+
| sku_crmid |  post_title    | start_date | start_time |   post_content    | u_id |
+-----------+----------------+------------+------------+-------------------+------+
|   null    | Unique Title 1 | 12/02/2013 |   8:00am   |  Unique Content 1 | id_1 |
|   null    | Unique Title 1 | 12/16/2013 |   8:00am   |  Unique Content 1 | id_2 |
|   null    | Unique Title 2 | 12/02/2013 |   8:00am   |  Unique Content 2 | id_3 |
|   null    | Unique Title 2 | 12/16/2013 |   8:00am   |  Unique Content 2 | id_4 |
|   null    | Unique Title 3 | 12/02/2013 |   8:00am   |  Unique Content 3 | id_5 |
|   null    | Unique Title 3 | 12/09/2013 |   8:00am   |  Unique Content 3 | id_6 |
+-----------+----------------+------------+------------+-------------------+------+

需要输出 - 选项2(最佳解决方案)

+-----------+----------------+-------------------------------------+-------------------+------+
| sku_crmid |  post_title    |          start_date_time            |   post_content    | u_id |
+-----------+----------------+-------------------------------------+-------------------+------+
|   skuid1  | Unique Title 1 | 12/02/2013 8:00am|12/16/2013 8:00am | Unique Content 1 | id_1 |
|   skuid2  | Unique Title 2 | 12/09/2013 8:00am|12/16/2013 8:00am | Unique Content 2  | id_2 |
|   skuid3  | Unique Title 3 | 12/02/2013 8:00am|12/09/2013 8:00am | Unique Content 3  | id_3 |
+-----------+----------------+-------------------------------------+-------------------+------+

所以最后,我需要一种方法来执行以下操作(如果可能):

  1. 将两个表合并为一个并分配unique_id,以便我可以导出为CSV

  2. 以永不重复的方式分配unique_id代

  3. 结合所有start_dates& start_times到一行/单元格并用管道(|)分开,管道两侧没有空格

  4. 如果管道解决方案不是一个选项......上面的选项1也可以......

  5. 如果它有助于我使用MySQL

2 个答案:

答案 0 :(得分:2)

尝试

SELECT * FROM Master_Table AS M 
JOIN Import_Table AS I ON I.post_title = M.post_title

这将在他们的常用帖子标题上加入你的两个表格。您可以更改*以选择所需的列。

答案 1 :(得分:2)

您可以使用uuid()功能指定唯一键。或者,您必须使用变量,如以下示例所示。

查询的关键是将主表连接到输入表,然后将行聚合到一行。

您想要的查询类似于:

select coalesce(it.sku_crmid, mt. sku_crmid) as sku_crmid,
       mt.post_title,
       group_concat(concat(it.start_date, it.start_time) separator '|') as start_date_time,
       coalesce(it.post_content, mt.post_content) as post_content,
       @rownum := @rownum + 1 as uid
from Master_table mt left outer join
     Import_Table it
     on it. post_title = mt. post_title cross join
     (select @rownum := 0) const
group by post_title;

由于日期/时间格式的问题,我说“类似”。您可能希望以不同方式格式化这些列。