mysql:将两条记录合并为一条

标签 mysql sql union

我的查询有以下结果集(其中有两个 SELECT 查询的 UNION)

app_id  transaction_id  mobile_no   user_input1                          user_input3                           user_input17                     user_input110                     user_input61            user_input62
104     731           918087318987  Welcome To Onida~Home Appliances    Home Appliances~Washing Machine Washing Machine~Fully Automatic Fully Automatic~SPARKLE 65S                NULL                  NULL
104     731           918087318987      NULL                               NULL                                     NULL                            NULL                           Quantity ~2                Amount~2

我想将这两条记录合并为1行

app_id  transaction_id  mobile_no   user_input1                          user_input3                           user_input17                     user_input110                     user_input61            user_input62
104     731           918087318987  Welcome To Onida~Home Appliances    Home Appliances~Washing Machine Washing Machine~Fully Automatic Fully Automatic~SPARKLE 65S           Quantity ~2                Amount~2

我可以提供我的 SQL 查询,但它太长了。如果需要,将提供。

SQL 架构:

create table `trn_user_log` (
`app_id` int (11),
`transaction_id` int (11),
`mobile_no` varchar (45),
`node_id` bigint (20),
`customer_attribute` varchar (150),
`entered_value` varchar (150)
); 

insert into `trn_user_log` (`app_id`, `transaction_id`, `mobile_no`, `node_id`, `customer_attribute`, `entered_value`) values('104','731','918087318987','103','Welcome To Onida','2');
insert into `trn_user_log` (`app_id`, `transaction_id`, `mobile_no`, `node_id`, `customer_attribute`, `entered_value`) values('104','731','918087318987','105','Home Appliances','1');
insert into `trn_user_log` (`app_id`, `transaction_id`, `mobile_no`, `node_id`, `customer_attribute`, `entered_value`) values('104','731','918087318987','119','Washing Machine','1');
insert into `trn_user_log` (`app_id`, `transaction_id`, `mobile_no`, `node_id`, `customer_attribute`, `entered_value`) values('104','731','918087318987','121','Fully Automatic','2');
insert into `trn_user_log` (`app_id`, `transaction_id`, `mobile_no`, `node_id`, `customer_attribute`, `entered_value`) values('104','731','918087318987','169','Quantity ','2');
insert into `trn_user_log` (`app_id`, `transaction_id`, `mobile_no`, `node_id`, `customer_attribute`, `entered_value`) values('104','731','918087318987','170','Amount','2');


create table `mst_node` (
`app_id` int (11),
`node_id` bigint (20),
`parent_node_id` bigint (20),
`display_seq` tinyint (4),
`display_text` varchar (540),
`customer_attribute` varchar (150)
);

insert into `mst_node` (`app_id`, `node_id`, `parent_node_id`,  `display_seq`, `display_text`,  `customer_attribute`) values('104','103',NULL,'1','Welcome To Onida','Welcome To Onida');
insert into `mst_node` (`app_id`, `node_id`, `parent_node_id`,  `display_seq`, `display_text`,  `customer_attribute`) values('104','105','103','2','Home Appliances','Home Appliances');
insert into `mst_node` (`app_id`, `node_id`, `parent_node_id`,  `display_seq`, `display_text`,  `customer_attribute`) values('104','119','105','1','Washing Machine','Washing Machine');
insert into `mst_node` (`app_id`, `node_id`, `parent_node_id`,  `display_seq`, `display_text`,  `customer_attribute`) values('104','121','119','1','Fully Automatic','Fully Automatic');
insert into `mst_node` (`app_id`, `node_id`, `parent_node_id`,  `display_seq`, `display_text`,  `customer_attribute`) values('104','124','121','2','SPARKLE 65S ','SPARKLE 65S ');
insert into `mst_node` (`app_id`, `node_id`, `parent_node_id`,  `display_seq`, `display_text`,  `customer_attribute`) values('104','125','121','3','Sparkle 65X','Sparkle 65X');
insert into `mst_node` (`app_id`, `node_id`, `parent_node_id`,  `display_seq`, `display_text`,  `customer_attribute`) values('104','126','121','4','Sparkle 62P','Sparkle 62P');
insert into `mst_node` (`app_id`, `node_id`, `parent_node_id`,  `display_seq`, `display_text`,  `customer_attribute`) values('104','169','124','1','Quantity ','Quantity ');
insert into `mst_node` (`app_id`, `node_id`, `parent_node_id`,  `display_seq`, `display_text`,  `customer_attribute`) values('104','170','124','2','Amount','Amount');

我的 SQL 查询:

SELECT *
FROM
(
SELECT T1.app_id,
   T1.transaction_id,
   T1.mobile_no,
   CONVERT(
      GROUP_CONCAT(
         (CASE T1.node_id
             WHEN 103 THEN CONCAT(T1.customer_attribute, '~', T2.display_text)
             ELSE NULL
          END)) USING LATIN1)
      AS user_input1,
      CONVERT(
      GROUP_CONCAT(
         (CASE T1.node_id
             WHEN 105 THEN CONCAT(T1.customer_attribute, '~', T2.display_text)
             ELSE NULL
          END)) USING LATIN1)
      AS user_input3,
      CONVERT(
      GROUP_CONCAT(
         (CASE T1.node_id
             WHEN 119 THEN CONCAT(T1.customer_attribute, '~', T2.display_text)
             ELSE NULL
          END)) USING LATIN1)
      AS user_input17,
      CONVERT(
      GROUP_CONCAT(
         (CASE T1.node_id
             WHEN 121 THEN CONCAT(T1.customer_attribute, '~', T2.display_text)
             ELSE NULL
          END)) USING LATIN1)
      AS user_input110,
   CONVERT(
      GROUP_CONCAT(
         (CASE T1.node_id
             WHEN 169 THEN CONCAT(T1.customer_attribute, '~', T2.display_text)
             ELSE NULL
          END)) USING LATIN1)
      AS user_input61,
   CONVERT(
      GROUP_CONCAT(
         (CASE T1.node_id
             WHEN 170 THEN CONCAT(T1.customer_attribute, '~', T2.display_text)
             ELSE NULL
          END)) USING LATIN1)
      AS user_input62
FROM trn_user_log T1 INNER JOIN mst_node T2 ON T1.APP_ID = T2.APP_ID
 WHERE     T1.app_id = 104
   AND T1.transaction_id = 731
   AND T1.node_id = T2.parent_node_id
   AND T2.`display_seq` = T1.entered_value
--   GROUP BY T1.app_id, T1.transaction_id, T1.mobile_no
--  ORDER BY T1.node_id

UNION 

SELECT T3.app_id,
   T3.transaction_id,
   T3.mobile_no,
   CONVERT(
      GROUP_CONCAT(
         (CASE T3.node_id
             WHEN 103 THEN CONCAT(T3.customer_attribute, '~', T3.entered_value)
             ELSE NULL
          END)) USING LATIN1)
      AS user_input1,
      CONVERT(
      GROUP_CONCAT(
         (CASE T3.node_id
             WHEN 105 THEN CONCAT(T3.customer_attribute, '~', T3.entered_value)
             ELSE NULL
          END)) USING LATIN1)
      AS user_input3,
      CONVERT(
      GROUP_CONCAT(
         (CASE T3.node_id
             WHEN 119 THEN CONCAT(T3.customer_attribute, '~', T3.entered_value)
             ELSE NULL
          END)) USING LATIN1)
      AS user_input17,
      CONVERT(
      GROUP_CONCAT(
         (CASE T3.node_id
             WHEN 121 THEN CONCAT(T3.customer_attribute, '~', T3.entered_value)
             ELSE NULL
          END)) USING LATIN1)
      AS user_input110,
   CONVERT(
      GROUP_CONCAT(
         (CASE T3.node_id
             WHEN 169 THEN CONCAT(T3.customer_attribute, '~', T3.entered_value)
             ELSE NULL
          END)) USING LATIN1)
      AS user_input61,
   CONVERT(
      GROUP_CONCAT(
         (CASE T3.node_id
             WHEN 170 THEN CONCAT(T3.customer_attribute, '~', T3.entered_value)
             ELSE NULL
          END)) USING LATIN1)
      AS user_input62
FROM trn_user_log T3 INNER JOIN mst_node T4 ON T3.APP_ID = T4.APP_ID
WHERE  T3.app_id = 104
   AND T3.transaction_id = 731
   AND T3.node_id = T4.node_id
   AND  not exists (select 1 from mst_node b where b.parent_node_id = t4.node_id)

--        GROUP BY T3.app_id, T3.transaction_id, T3.mobile_no
-- ORDER BY T3.node_id
)T 
GROUP BY T.app_id, T.transaction_id, T.mobile_no

SQLFiddle Demo Schema and Query

最佳答案

您可以将两个选择相互JOIN,然后对列执行COALESCE

http://www.sqlfiddle.com/#!2/bfcd8/15

SELECT app_id,transaction_id,mobile_no,
coalesce(tt1.USER_INPUT1,tt2.USER_INPUT1) AS USER_INPUT1,
coalesce(tt1.USER_INPUT3,tt2.USER_INPUT3) AS USER_INPUT3,
coalesce(tt1.USER_INPUT17,tt2.USER_INPUT17) AS USER_INPUT17,
coalesce(tt1.USER_INPUT110,tt2.USER_INPUT110) AS USER_INPUT110,
coalesce(tt1.USER_INPUT61,tt2.USER_INPUT61) AS USER_INPUT61,
coalesce(tt1.USER_INPUT62,tt2.USER_INPUT62) AS USER_INPUT62
 FROM (SELECT T1.app_id,
       T1.transaction_id,
       T1.mobile_no,
       CONVERT(
          GROUP_CONCAT(
             (CASE T1.node_id
                 WHEN 103 THEN CONCAT(T1.customer_attribute, '~', T2.display_text)
                 ELSE NULL
              END)) USING LATIN1)
          AS user_input1,
          CONVERT(
          GROUP_CONCAT(
             (CASE T1.node_id
                 WHEN 105 THEN CONCAT(T1.customer_attribute, '~', T2.display_text)
                 ELSE NULL
              END)) USING LATIN1)
          AS user_input3,
          CONVERT(
          GROUP_CONCAT(
             (CASE T1.node_id
                 WHEN 119 THEN CONCAT(T1.customer_attribute, '~', T2.display_text)
                 ELSE NULL
              END)) USING LATIN1)
          AS user_input17,
          CONVERT(
          GROUP_CONCAT(
             (CASE T1.node_id
                 WHEN 121 THEN CONCAT(T1.customer_attribute, '~', T2.display_text)
                 ELSE NULL
              END)) USING LATIN1)
          AS user_input110,
       CONVERT(
          GROUP_CONCAT(
             (CASE T1.node_id
                 WHEN 169 THEN CONCAT(T1.customer_attribute, '~', T2.display_text)
                 ELSE NULL
              END)) USING LATIN1)
          AS user_input61,
       CONVERT(
          GROUP_CONCAT(
             (CASE T1.node_id
                 WHEN 170 THEN CONCAT(T1.customer_attribute, '~', T2.display_text)
                 ELSE NULL
              END)) USING LATIN1)
          AS user_input62
  FROM trn_user_log T1 INNER JOIN mst_node T2 ON T1.APP_ID = T2.APP_ID
 WHERE     T1.app_id = 104
       AND T1.transaction_id = 731
       AND T1.node_id = T2.parent_node_id
       AND T2.`display_seq` = T1.entered_value
--   GROUP BY T1.app_id, T1.transaction_id, T1.mobile_no
--  ORDER BY T1.node_id
) AS tt1

LEFT JOIN

(SELECT T3.app_id,
       T3.transaction_id,
       T3.mobile_no,
       CONVERT(
          GROUP_CONCAT(
             (CASE T3.node_id
                 WHEN 103 THEN CONCAT(T3.customer_attribute, '~', T3.entered_value)
                 ELSE NULL
              END)) USING LATIN1)
          AS user_input1,
          CONVERT(
          GROUP_CONCAT(
             (CASE T3.node_id
                 WHEN 105 THEN CONCAT(T3.customer_attribute, '~', T3.entered_value)
                 ELSE NULL
              END)) USING LATIN1)
          AS user_input3,
          CONVERT(
          GROUP_CONCAT(
             (CASE T3.node_id
                 WHEN 119 THEN CONCAT(T3.customer_attribute, '~', T3.entered_value)
                 ELSE NULL
              END)) USING LATIN1)
          AS user_input17,
          CONVERT(
          GROUP_CONCAT(
             (CASE T3.node_id
                 WHEN 121 THEN CONCAT(T3.customer_attribute, '~', T3.entered_value)
                 ELSE NULL
              END)) USING LATIN1)
          AS user_input110,
       CONVERT(
          GROUP_CONCAT(
             (CASE T3.node_id
                 WHEN 169 THEN CONCAT(T3.customer_attribute, '~', T3.entered_value)
                 ELSE NULL
              END)) USING LATIN1)
          AS user_input61,
       CONVERT(
          GROUP_CONCAT(
             (CASE T3.node_id
                 WHEN 170 THEN CONCAT(T3.customer_attribute, '~', T3.entered_value)
                 ELSE NULL
              END)) USING LATIN1)
          AS user_input62
FROM trn_user_log T3 INNER JOIN mst_node T4 ON T3.APP_ID = T4.APP_ID
WHERE  T3.app_id = 104
       AND T3.transaction_id = 731
       AND T3.node_id = T4.node_id
       AND  NOT EXISTS (SELECT 1 FROM mst_node b WHERE b.parent_node_id = t4.node_id)

--        GROUP BY T3.app_id, T3.transaction_id, T3.mobile_no
-- ORDER BY T3.node_id
  ) AS tt2 USING (app_id, transaction_id, mobile_no)

关于mysql:将两条记录合并为一条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12488801/

相关文章:

sql - Android 无法将数据插入 Azure SQL,但可以插入数据

php - 归档数据并运行报告

mysql - 在 mysql 表中搜索 email(unique) 列

来自具有多个计数和计算行的多个表的 MYSQL 查询

mysql - 将 DISTINCT 添加到 UNION 查询

database - 任何比 Oracle Database Union 更快的选择

sql - 为我的应用程序的每个问题创建不同的用户!

mysql - 在 Rails 中使用 where 并仅检查第一个元素

php - 在按列表排序的表中移动记录的最佳方法

php - mysql找不到没有通配符的数据