Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

Concatenate ค่าจากคอลัมน์เดียวกันเงื่อนไขต่างกันใน MySQL

การเตรียมข้อมูล

mysql> CREATE TABLE DemoTable1869 (
    Id INT, Subject VARCHAR(20), Name VARCHAR(20)
);

mysql> INSERT INTO DemoTable1869 VALUES
    (100, 'MySQL', 'John'), (100, 'MongoDB', 'Smith'),
    (101, 'MySQL', 'Chris'), (101, 'MongoDB', 'Brown');

ข้อมูลในตาราง

+------+---------+-------+
| Id   | Subject | Name  |
+------+---------+-------+
|  100 | MySQL   | John  |
|  100 | MongoDB | Smith |
|  101 | MySQL   | Chris |
|  101 | MongoDB | Brown |
+------+---------+-------+

รวม Name ตาม Subject ในแต่ละ Id

mysql> SELECT Id, CONCAT(StudentFirstName, '', StudentLastName)
    FROM (
        SELECT Id,
            MAX(CASE WHEN Subject = 'MySQL' THEN Name END) AS StudentFirstName,
            MAX(CASE WHEN Subject = 'MongoDB' THEN Name END) AS StudentLastName
        FROM DemoTable1869
        GROUP BY Id
    ) tbl;

ผลลัพธ์:

+------+---------------------------------------------+
| Id   | concat(StudentFirstName,'',StudentLastName) |
+------+---------------------------------------------+
|  100 | JohnSmith                                   |
|  101 | ChrisBrown                                  |
+------+---------------------------------------------+

การทำงานของ Conditional Aggregation

  1. CASE WHEN Subject='MySQL' THEN Name END → คืน Name ถ้า MySQL, ไม่งั้น NULL
  2. MAX(...) ข้าม NULL ไป → ได้ค่าที่ไม่ใช่ NULL (มีเพียง 1 ค่า)
  3. GROUP BY Id รวมเป็น 1 แถวต่อ Id
  4. Outer Query: CONCAT รวม First + Last

วิธีอื่น: GROUP_CONCAT (MySQL 8.0+)

-- เรียงตาม Subject แล้วรวม
SELECT Id, GROUP_CONCAT(Name ORDER BY Subject SEPARATOR '') 
FROM DemoTable1869 
GROUP BY Id;

-- กำหนดลำดับ Subject ชัดเจน
SELECT Id, GROUP_CONCAT(Name ORDER BY FIELD(Subject, 'MySQL', 'MongoDB') SEPARATOR '')
FROM DemoTable1869 GROUP BY Id;

Pivot Table (Crosstab) Pattern

เทคนิคนี้เรียกว่า Pivot: แปลง Rows เป็น Columns

SELECT 
    Id,
    MAX(CASE WHEN Subject = 'MySQL' THEN Name END) AS MySQL_Name,
    MAX(CASE WHEN Subject = 'MongoDB' THEN Name END) AS MongoDB_Name
FROM DemoTable1869
GROUP BY Id;