While there are typically many rows of information stored in MySQL, there are occasions when we might opt to merge several rows into a single column. MySQL provides multiple methods to achieve this, such as JSON_ARRAYAGG() for organized output and GROUP_CONCAT(). In this article, we will delve into how to combine multiple rows into one field in MySQL, complete with examples for each method.
Contents Overview:
- Why is it essential to Merge Multiple Rows into One Field?
- Benefits of Merging Multiple Rows into One Field
- Ways to Combine Multiple Rows into One Field in MySQL
- Method 1: Utilizing GROUP_CONCAT() in MySQL
- Method 2: Implementing ORDER BY within GROUP_CONCAT() in MySQL
- Method 3: Applying GROUP_CONCAT() with Multiple Columns in MySQL
- Method 4: Using GROUP_CONCAT() along with HAVING Clause in MySQL
- Method 5: Employing Basic JSON_ARRAYAGG() in MySQL
- Method 6: Utilizing Variables (@var) for Row-by-Row Merging in MySQL
- Comparison of Performance for Each Method
- Real-World Scenarios
- Optimal Practices
- Summary
Why is it Essential to Merge Several Rows into a Single Field?
When exporting data in formats that require a more organized structure, like CSV or JSON, merging rows into a single field within MySQL helps eliminate duplicate entries and consolidates pertinent information that enhances report clarity. This method simplifies data retrieval, making the query execution more efficient. The presentation of data is refined by displaying a single summarized row instead of multiple entries. The GROUP_CONCAT() function, frequently employed in MySQL, facilitates concatenation with a customizable separator.
Benefits of Merging Multiple Rows into One Field
- Enhanced Clarity: Related information is presented on a single line, facilitating easier comprehension when creating reports or queries of the results.
- Simplified Reporting: The process of generating reports is streamlined due to the capability to amalgamate similar entries into a straightforward format.
- Advanced Queries: To enhance performance, it is preferable to minimize the use of joins and subqueries.
Ways to Combine Multiple Rows into One Field in MySQL
Prior to discussing the methods for merging multiple rows into one field, we will set up a table named Orders that will serve as an example for the following techniques.
--Create an Orders table
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
customer_id INT,
product_name VARCHAR(100)
);
-- Insert some values into it
INSERT INTO orders (customer_id, product_name) VALUES
(1, 'Laptop'),
(1, 'Mouse'),
(1, 'Keyboard'),
(2, 'Monitor'),
(2, 'Desk'),
(3, 'Phone'),
(3, 'Charger'),
(3, 'Headphones');
Method 1: Utilizing GROUP_CONCAT() in MySQL
A MySQL aggregate function known as GROUP_CONCAT() merges several rows into a single string grouped by a specified field.
Syntax:
GROUP_CONCAT(expression)
Example:
SELECT customer_id, GROUP_CONCAT(product_name) AS products FROM orders GROUP BY customer_id;
Output:

Explanation: In this instance, GROUP_CONCAT() aggregates product names for each CustomerID into a singular string, separated by commas.
Method 2: Implementing ORDER BY within GROUP_CONCAT() in MySQL
This function sorts variables contained in GROUP_CONCAT() to maintain a specific sequence before merging.
Syntax
GROUP_CONCAT(expression ORDER BY expression)
Example:
SELECT customer_id, GROUP_CONCAT(product_name ORDER BY product_name) AS products FROM orders GROUP BY customer_id;
Output:

Explanation: Here, GROUP_CONCAT(product_name) compiles numerous product names for each customer into a single string.
Method 3: Applying GROUP_CONCAT() with Multiple Columns in MySQL
This method merges values from various columns within GROUP_CONCAT() to concatenate them together.
Syntax:
GROUP_CONCAT(CONCAT(col1, 'text', col2))
Example:
SELECT customer_id, GROUP_CONCAT(CONCAT(product_name, ' (Order ID: ', order_id, ')') ORDER BY product_name SEPARATOR ', ') AS products
FROM orders
GROUP BY customer_id;
Output:
Clarification: The GROUP_CONCAT(CONCAT(…)) function is employed to amalgamate several row values into a singular string for every group. The CONCAT() function organizes each row by attaching the order ID beside the product name.
Method 4: Employing GROUP_CONCAT() with HAVING Clause in MySQL
The HAVING Clause is utilized to narrow down the grouped outcomes based on the concatenated results.
Syntax:
HAVING concatenated_column LIKE '%value%'
Example:
SELECT customer_id, GROUP_CONCAT(product_name ORDER BY product_name SEPARATOR ', ') AS products
FROM orders
GROUP BY customer_id
HAVING products LIKE '%Mouse%';
Output:

Clarification: The HAVING Clause in this example filters the results to display only customers with at least one product that contains the term “Mouse”. The notation %Mouse% indicates that the word Mouse can be positioned anywhere within the concatenated product array.
Method 5: Utilizing Basic JSON_ARRAYAGG() in MySQL
Rather than merging the multiple-row information into a string divided by commas, this function compiles them into a formatted JSON array.
Syntax:
JSON_ARRAYAGG(expression)
Example:
SELECT customer_id, JSON_ARRAYAGG(product_name) AS products_json
FROM orders
GROUP BY customer_id;
Output:

Clarification: In this instance, the JSON_ARRAYAGG(product_name) function produces a structured JSON array of product_name.
Method 6: Implementing Variables (@var) for Row-by-Row Concatenation in MySQL
Successively amalgamating values row by row without utilizing GROUP_CONCAT can be achieved using MySQL session variables.
Syntax:
SET @var = '';
SELECT @var := CONCAT(@var, column_name, 'separator') FROM table_name;
SELECT @var AS concatenated_result;
Example:
SET @product_list = '';
SELECT @product_list := CONCAT(@product_list, product_name, ', ')
FROM orders;
SELECT TRIM(TRAILING ', ' FROM @product_list) AS products;
Output:

Clarification: In this example, values are added to @product_list during each iteration of the SELECT statement. The command “SELECT @product_list AS products” shows the final merged result.
Performance Analysis of Each Approach
Method | Use Case | Advantages | Disadvantages |
Utilizing GROUP_CONCAT() | Basic row concatenation | Effectively manages both large and small datasets. | Not effective for hierarchical structures |
Utilizing ORDER BY within GROUP_CONCAT() | Ordered concatenation | Ensures a sequence of concatenated items | Requires indexing for performance enhancement |
Utilizing GROUP_CONCAT with multiple columns | Concatenating several columns within one row | Permits formatting with extra details | More intricate query syntax |
Utilizing GROUP_CONCAT() with HAVING Clause | Filtering concatenated results | Facilitates filtering post-concatenation | May affect performance with extensive datasets |
Utilizing JSON_ARRAYAGG() | Returning JSON array format for applications | Structured JSON output | Slower compared to GROUP_CONCAT |
Utilizing Variables(@var) | Row-by-row concatenation without GROUP_CONCAT | Effective when GROUP_CONCAT() is not viable | Slower in comparison to GROUP_CONCAT() |
Practical Scenarios
1. E-Commerce Platform
To display all products purchased by individual customers in a single row, the e-commerce platform has devised a query.
Example:
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
customer_id INT,
product_name VARCHAR(255)
);
INSERT INTO orders (customer_id, product_name) VALUES
(1, 'Laptop'), (1, 'Mouse'), (1, 'Keyboard'),
(2, 'Monitor'), (2, 'Desk'), (3, 'Headphones');
SELECT customer_id,
GROUP_CONCAT(product_name ORDER BY product_name SEPARATOR ', ') AS products
FROM orders
GROUP BY customer_id;
Output:

Clarification: In this instance, GROUP_CONCAT() organizes products by customer_id and merges them in a single field. The ORDER BY within GROUP_CONCAT() guarantees an alphabetical arrangement of products.
2. Employee Management System
A firm aims to record various skills of employees in a singular row for convenient access to the information.
Example:
CREATE TABLE employee_skills (
emp_id INT,
skill VARCHAR(255)
);
INSERT INTO employee_skills (emp_id, skill) VALUES
(101, 'Python'), (101, 'SQL'), (101, 'Machine Learning'),
(102, 'Java'), (102, 'Spring Boot'), (103, 'React'), (103, 'JavaScript');
SELECT emp_id,
GROUP_CONCAT(skill ORDER BY skill SEPARATOR ', ') AS skills
FROM employee_skills
GROUP BY emp_id;
Output:

Clarification:In this instance, the group_concat() function aggregates skills by emp_id and merges them into a single field. The ORDER BY clause within GROUP_CONCAT() guarantees that the skills are arranged in alphabetical order.
3. Book Store
Within a library, books can be authored by multiple individuals, and this should ideally be represented in one row per book to facilitate easy identification.
Example:
CREATE TABLE book_authors (
book_id INT,
book_name VARCHAR(255),
author VARCHAR(255)
);
INSERT INTO book_authors (book_id, book_name, author) VALUES
(1, 'Database Systems', 'Elmasri'),
(1, 'Database Systems', 'Navathe'),
(2, 'Clean Code', 'Robert C. Martin'),
(3, 'The Pragmatic Programmer', 'Andrew Hunt'),
(3, 'The Pragmatic Programmer', 'David Thomas');
SELECT book_id, book_name,
GROUP_CONCAT(author ORDER BY author SEPARATOR ', ') AS authors
FROM book_authors
GROUP BY book_id, book_name;
Output:
Explanation: In this context, the GROUP BY clause ensures that each book, as identified by book_id, is aggregated. The SEPARATOR ‘,’ guarantees that multiple authors are differentiated by a comma followed by a space.
Best Practices
- Optimal Use of GROUP_CONCAT(): For string aggregation, utilize GROUP_CONCAT() with a suitable ORDER BY and SEPARATOR.
- Controlling String Length: In MySQL, group_concat_max_len usually has a default setting of 1024 bytes, which can be adjusted if needed.
- Choosing Alternative Separators: When values include commas, opt for clearly distinct separators (like |,;,, ) to prevent confusion.
- Improving Performance: To reduce unnecessary ORDER BY clauses, implement indexing with larger datasets.
Conclusion
The diverse methods of concatenation for uniting multiple MySQL rows into a single field are powerful techniques that offer a proficient way to display data. Based on performance needs, options like variables, JSON_ARRAYAGG(), and GROUP_CONCAT() each have their merits. GROUP_CONCAT() is commonly the preferred method for straightforward row aggregation, while JSON_ARRAYAGG() delivers organized JSON output.
To delve deeper into SQL functions, consider enrolling in this SQL course and also review SQL Interview Questions curated by industry professionals.
How to Concatenate Multiple Rows into One Field in MySQL – FAQs
The article How to Concatenate Multiple Rows into One Field in MySQL? was originally featured on Intellipaat Blog.