【问题标题】:Combine rows from two tables with different columns?将两个表中的行与不同的列合并?
【发布时间】:2015-01-08 10:33:44
【问题描述】:

我很难理解这个问题。我相信它正在发生,因为我基于同一列 (user_id) 加入了两个单独的表,但我不知道如何解决它,因为这两个表之间唯一的共同点是 user_id 列。

这是查询。

SELECT users_data_existing.`date`,`message`,`action`,`status`,`data`,
users_data_new.`date`,`data_new`
FROM users_data_existing
INNER JOIN users_data_action USING (action_id)
INNER JOIN users_data_status_user USING (status_user_id)
INNER JOIN `users` USING (user_id)
INNER JOIN users_data_new USING (user_id)
INNER JOIN data ON users_data_existing.`data_id` = data.`id`
WHERE users_data_existing.`user_id` = 2
ORDER BY users_data_existing.`date`,users_data_new.`date` DESC

结果,users_data_new.datedata_new 列被连接或“附加”到前面的行。

+----------+-----------+-----------+-----------+-----------+----------+-----------+
|   date   |  message  |   action  |   status  |    data   |   date   |  data_new |
+----------+-----------+-----------+-----------+-----------+----------+-----------+
|2011-01-01|    data   |    data   |    data   |    data   |2011-01-02| data_new  |
-----------------------------------------------------------------------------------
|2011-01-01|    data   |    data   |    data   |    data   |2011-01-03| data_new1 |
-----------------------------------------------------------------------------------

               REPEATS PATTERN FOR TOTAL RECORDS IN users_data_new TABLE 

+----------+-----------+-----------+-----------+-----------+----------+-----------+
|   date   |  message  |   action  |   status  |    data   |   date   |  data_new |
+----------+-----------+-----------+-----------+-----------+----------+-----------+
|2011-01-01|   data1   |   data1   |   data1   |   data1   |2011-01-02| data_new  |
-----------------------------------------------------------------------------------
|2011-01-01|   data1   |   data1   |   data1   |   data1   |2011-01-03| data_new1 |
-----------------------------------------------------------------------------------

但这不是我需要的。如何将最后两列放到单独的行中?我认为UNION 可以解决这个问题,但我不能这样做,因为这些表几乎相同,但不共享message 列。

【问题讨论】:

  • 如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。

标签: mysql join union


【解决方案1】:

正如问题中所怀疑的那样,我需要的是UNION。诀窍是在users_data_new 中创建一个空列以匹配users_data_existing。我在排序方面也遇到了挑战,所以我也将其包括在此处。

(SELECT data_existing.date AS submitdate,status_user.status,action.action,
data.data,data_existing.message
FROM users_data_existing AS data_existing
INNER JOIN users_requested_status_user status_user 
ON data_existing.status_user_id = status_user.status_user_id
INNER JOIN users_requested_action action 
ON data_existing.action_id = action.action_id
INNER JOIN websites data 
ON data_existing.data_id = data.id
ORDER BY data_existing.date DESC) //sorts sub-query

UNION ALL

(SELECT data_new.date AS submitdate,status_user.status,  
action.action,data_new.data_new,'' message //needed to add this last empty column
FROM users_data_new AS data_new
INNER JOIN users_requested_status_user status_user 
ON data_new.status_user_id = status_user.status_user_id
INNER JOIN users_requested_action action 
ON data_new.action_id = action.action_id
ORDER BY data_new.date DESC) //sorts sub-query
ORDER BY submitdate DESC"; //sorts the entire result

请记住,对于日期的别名,关联数组键将是您使用的任何别名。即$result['submitdate']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-10
    • 2022-01-05
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    相关资源
    最近更新 更多