1到n关系中的MySQL数据透视表

1到n关系中的MySQL数据透视表,mysql,join,Mysql,Join,我有这样的数据 表主项 +-------+---------+ |item_id|item_name| +-------+---------+ | 001 | Car A | | 002 | Car B | +-------+---------+ +-------+---------+ |项目标识|项目名称| +-------+---------+ |001 | A车| |002 | B车| +-------+---------+ 并将关系转换为表进程 +-------+----

我有这样的数据 表主项

+-------+---------+ |item_id|item_name| +-------+---------+ | 001 | Car A | | 002 | Car B | +-------+---------+ +-------+---------+ |项目标识|项目名称| +-------+---------+ |001 | A车| |002 | B车| +-------+---------+ 并将关系转换为表进程

+-------+--------+ |proc_id|proc_seq| +-------+--------+ | 001 | 1 | | 001 | 2 | | 001 | 3 | | 001 | 4 | | 001 | 5 | | 002 | 1 | | 002 | 2 | | 002 | 3 | +-------+--------+ +-------+--------+ |程序id |程序顺序| +-------+--------+ | 001 | 1 | | 001 | 2 | | 001 | 3 | | 001 | 4 | | 001 | 5 | | 002 | 1 | | 002 | 2 | | 002 | 3 | +-------+--------+ 当我选择item_id=001时,我希望得到这样的结果

+-------+---------+-----+-----+-----+-----+-----+-----+-----+ |item_id|item_name|proc1|proc2|proc3|proc4|proc5|proc6|proc7| +-------+---------+-----+-----+-----+-----+-----+-----+-----+ | 001 | Car A | 1 | 2 | 3 | 4 | 5 | | | +-------+---------+-----+-----+-----+-----+-----+-----+-----+ +-------+---------+-----+-----+-----+-----+-----+-----+-----+ |项目id |项目名称| proc1 | proc2 | proc3 | proc4 | proc5 | proc6 | proc7| +-------+---------+-----+-----+-----+-----+-----+-----+-----+ |001 | A车| 1 | 2 | 3 | 4 | 5 || +-------+---------+-----+-----+-----+-----+-----+-----+-----+
生成此结果的查询是什么?

使用
组\u concat
然后将数据拆分为单独的列,您可以执行此操作

SELECT t1.*,
      SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(t2.proc_seq), ',', 1), ',', -1) AS proc1, 
      SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(t2.proc_seq), ',', 2), ',', -1) AS proc2, 
      SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(t2.proc_seq), ',', 3), ',', -1) AS proc3, 
      SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(t2.proc_seq), ',', 4), ',', -1) AS proc4, 
      SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(t2.proc_seq), ',', 5), ',', -1) AS proc5
FROM tt1 t1
LEFT JOIN tt2 t2 ON t1.item_id=t2.proc_id

问题在于
透视表
类别

在这里,您可以通过以下查询完成您的结果:

SET @sql := '';
SELECT 
CONCAT('SELECT 
MI.item_id,
MI.item_name,',
GROUP_CONCAT('MAX(CASE WHEN P.proc_seq =', P.proc_seq ,' THEN P.proc_seq END) AS ', 'proc',P.proc_seq,' '),
'FROM master_item MI
INNER JOIN process P ON MI.item_id = P.proc_id
WHERE MI.item_id = 1
GROUP BY P.proc_id') INTO @sql
FROM master_item MI
INNER JOIN process P ON MI.item_id = P.proc_id
WHERE item_id = 1
GROUP BY P.proc_id;


PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE stmt;

但正如我所说,最好在应用程序逻辑中完成这类工作。否则,仅通过MySQL就太麻烦了

编辑:

为了获得每个
项目的结果_id

SET @sql := '';
SELECT 
CONCAT('SELECT 
MI.item_id,
MI.item_name,',
GROUP_CONCAT('MAX(CASE WHEN P.proc_seq =', P.proc_seq ,' THEN P.proc_seq END) AS ', 'proc',P.proc_seq,' '),
'FROM master_item MI
INNER JOIN process P ON MI.item_id = P.proc_id
GROUP BY P.proc_id') INTO @sql
FROM master_item MI
INNER JOIN process P ON MI.item_id = P.proc_id

WHERE
    item_id = (
        SELECT
            maxProcId.proc_id
        FROM
            (
                SELECT
                    proc_id,
                    COUNT(proc_seq) total
                FROM process
                GROUP BY proc_id
                ORDER BY total DESC
                LIMIT 1
            ) AS maxProcId
    )
GROUP BY
    P.proc_id;


PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE stmt;

thx@ashkufaraz,谢谢您的回复,但我希望结果按照流程显示在每一列中,而不是在列中显示一个procei update my answer,您可以使用sub string_indexgreat来完成,但当seq是随机的时,流程不准确。必须首先索引采用简单查询,而不是通过pivot表查询来完成此操作。在应用程序级别完成其余工作很好,但是名称和id始终为1,车辆A和流程是随机的。您不希望只对
项_id=1
进行结果查询吗?请在编辑部分下运行更新的查询。我在那里做了一个改变。