简体   繁体   中英

Merge two database rows with same ID

Hi I've got the following mysql table 在此处输入图片说明

How can I merge the two rows hilighted in red?

This is my stored procedure code:

BEGIN

    SELECT

    GROUP_CONCAT(
    CONCAT("MAX(IF(km_kondomanager_millesimal_table_value_table_id='", km_kondomanager_millesimal_table_value_table_id, "',km_kondomanager_millesimal_table_millesimal_value ,0.00)) AS '", km_kondomanager_millesimal_table_name, "'"), "
"
      )INTO @answers
    FROM (
      SELECT DISTINCT km_kondomanager_millesimal_table_value_table_id, km_kondomanager_millesimal_table_name FROM km_kondomanager_millesimal_table_values INNER JOIN km_kondomanager_millesimal_table
                 ON km_kondomanager_millesimal_table_values . km_kondomanager_millesimal_table_value_table_id = km_kondomanager_millesimal_table. km_kondomanager_millesimal_table_id

        WHERE km_kondomanager_millesimal_table_value_group_id = km_group
    ) A;

    SET @query := 
      CONCAT(
        'SELECT km_kondomanager_millesimal_table_value_building_id AS "Flat ID", km_kondomanager_building_unit_code AS "Building Code", CONCAT_WS(" ", km_user_first_name,  km_user_last_name) AS "Proprietario", ', @answers, 

'FROM km_kondomanager_millesimal_table_values 
INNER JOIN km_kondomanager_building_units
ON km_kondomanager_millesimal_table_values . km_kondomanager_millesimal_table_value_building_id = km_kondomanager_building_units. km_kondomanager_building_unit_id 
LEFT JOIN km_kondomanager_building_unit_owners 
ON km_kondomanager_millesimal_table_values . km_kondomanager_millesimal_table_value_building_id = km_kondomanager_building_unit_owners. km_kondomanager_building_unit_owner_building_unit_id 
LEFT JOIN km_users 
ON km_kondomanager_building_unit_owners . km_kondomanager_building_unit_owner_id = km_users. km_user_id
WHERE km_kondomanager_millesimal_table_value_group_id = ',km_group,' GROUP BY km_kondomanager_millesimal_table_value_building_id, km_user_first_name, km_user_last_name'
      );

    PREPARE statement FROM @query;
    EXECUTE statement;
END

And this is what i'm trying to achieve 在此处输入图片说明

Ok, my following code is build around your statement. I can not test it because i don't have any data, so you have to debug it further.

But the gist is, You select your Flate ID, MAX building code and the GROUP_CONCAT Proprietario GROUP By Flate ID and add your @answer there after you selected Flate ID, Building Id and Proprietario without the @answer. The variable @answer2 contains the maximum of value of the column km_kondomanager_millesimal_table_name from the inner Select

BEGIN

SELECT 
   GROUP_CONCAT(
     CONCAT
     (
     "MAX
   (
     IF
     (km_kondomanager_millesimal_table_value_table_id='",
       km_kondomanager_millesimal_table_value_table_id, "'
      ,km_kondomanager_millesimal_table_millesimal_value ,0.00
      )
  ) AS '", km_kondomanager_millesimal_table_name, "'
"), "

"
),GROUP_CONCAT(
CONCAT
  (
  "MAX
   (
     '", km_kondomanager_millesimal_table_name, "'
  ) AS '", km_kondomanager_millesimal_table_name, "'
"), "

"
) INTO @answers,@answers2
FROM (
  SELECT 
    DISTINCT km_kondomanager_millesimal_table_value_table_id,
    km_kondomanager_millesimal_table_name 
  FROM 
    km_kondomanager_millesimal_table_values 
    INNER JOIN km_kondomanager_millesimal_table
      ON 
       km_kondomanager_millesimal_table_values.
       km_kondomanager_millesimal_table_value_table_id 
      =
       km_kondomanager_millesimal_table.
       km_kondomanager_millesimal_table_id
    WHERE km_kondomanager_millesimal_table_value_group_id = km_group
  ) A;

SET @query := 
  CONCAT(
    'SELECT "Flat ID",MAX("Building Code"),
      GROUP_CONCAT(Proprietario), ', @answers2, 
    ' FROM 
        (
       SELECT 
       km_kondomanager_millesimal_table_value_building_id AS "Flat ID"
       , km_kondomanager_building_unit_code AS "Building Code"
       , CONCAT_WS(" ", km_user_first_name,  km_user_last_name) AS 
       "Proprietario"', @answers, 
     ' FROM 
       km_kondomanager_millesimal_table_values 
       INNER JOIN km_kondomanager_building_units
       ON km_kondomanager_millesimal_table_values.
          km_kondomanager_millesimal_table_value_building_id 
         = km_kondomanager_building_units.
           km_kondomanager_building_unit_id 
       LEFT JOIN km_kondomanager_building_unit_owners 
         ON km_kondomanager_millesimal_table_values.
            km_kondomanager_millesimal_table_value_building_id
           = km_kondomanager_building_unit_owners.
              km_kondomanager_building_unit_owner_building_unit_id 
       LEFT JOIN km_users 
         ON km_kondomanager_building_unit_owners. 
            km_kondomanager_building_unit_owner_id 
           = km_users km_user_id
      WHERE 
        km_kondomanager_millesimal_table_value_group_id = '
        ,km_group,
        ' GROUP BY 
        km_kondomanager_millesimal_table_value_building_id
        , km_user_first_name
        , km_user_last_name
     ) t1
    GROUP BY "Flat ID";'
  );

PREPARE statement FROM @query;
EXECUTE statement;
END

Ok so I believe I've found the solution to the problem thanks to @nbk here it is

BEGIN
    SELECT

    GROUP_CONCAT(
    CONCAT("MAX(IF(km_kondomanager_millesimal_table_value_table_id='", km_kondomanager_millesimal_table_value_table_id, "',km_kondomanager_millesimal_table_millesimal_value ,0.00)) AS '", km_kondomanager_millesimal_table_name, "'"), "
"
      )INTO @answers
    FROM (
      SELECT DISTINCT km_kondomanager_millesimal_table_value_table_id, km_kondomanager_millesimal_table_name FROM km_kondomanager_millesimal_table_values INNER JOIN km_kondomanager_millesimal_table
                 ON km_kondomanager_millesimal_table_values . km_kondomanager_millesimal_table_value_table_id = km_kondomanager_millesimal_table. km_kondomanager_millesimal_table_id

        WHERE km_kondomanager_millesimal_table_value_group_id = km_group
    ) A;

    SET @query := 
      CONCAT(
        'SELECT km_kondomanager_millesimal_table_value_building_id AS "Building ID", km_kondomanager_building_unit_code AS "Building Code", group_concat(DISTINCT CONCAT_WS(" ", km_user_first_name,  km_user_last_name)) AS "Proprietario", ', @answers, 
        ' FROM km_kondomanager_millesimal_table_values 
          INNER JOIN km_kondomanager_building_units
                 ON km_kondomanager_millesimal_table_values . km_kondomanager_millesimal_table_value_building_id = km_kondomanager_building_units. km_kondomanager_building_unit_id 
          LEFT JOIN km_kondomanager_building_unit_owners 
                 ON km_kondomanager_millesimal_table_values . km_kondomanager_millesimal_table_value_building_id = km_kondomanager_building_unit_owners. km_kondomanager_building_unit_owner_building_unit_id
                 LEFT JOIN km_users 
                 ON km_kondomanager_building_unit_owners . km_kondomanager_building_unit_owner_id = km_users. km_user_id
          WHERE km_kondomanager_millesimal_table_value_group_id = ',km_group,' GROUP BY km_kondomanager_millesimal_table_value_building_id'
      );

    PREPARE statement FROM @query;
    EXECUTE statement;
END

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM