mysql - 合并具有相同列的 2 个表

标签 mysql

已经查看了 stackoverflow 和 Google 并且已经接近,但是还没有找到一个完整的解决方案......也许这是一个简单的解决方案,以前不需要任何人寻求帮助?

我有 2 个类(class)表和类(class)相关信息(Master_Table 和 Import_Table)。 Master_Table 表包含每门类(class)的核心内容/信息,但缺少日期和时间,因为这些每周更改一次(目前大约有 240 行核心类(class))。参见下面的 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 是两个表之间唯一唯一的东西。虽然 post_title 将在 Master_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”出局即可。

下面是 2 个可能的输出,如果它们可能的话也没有问题。选项 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 也可以...

如果有帮助,我正在使用 MySQL

最佳答案

您可以使用 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;

我说“类似”是因为日期/时间格式的问题。您可能希望以不同方式设置这些列的格式。

关于mysql - 合并具有相同列的 2 个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20386965/

相关文章:

PHP/MySQL 到 PDO?

php - 电子邮件未发送 mdaemon 配置完成但邮件未发送通过且未收到错误 php 文件

mysql - PDO rowCount() 替代方案

php - 无法使用 laravel Eloquent 地获取数据

php - 如何在月份日期条件下从mysql表中获取确切数据

mysql - Rails ActiveRecord 删除记录,一次删除一条关联记录

mysql - 删除非关系配置中的记录

php - 使用搜索文本框加载更多结果

mysql - 是否可以减少重复的子查询查找?

php - 如何在查询中用 0 替换 NULL?