Php 我怎样才能得到这个结果?

Php 我怎样才能得到这个结果?,php,mysql,string,yii2,pivot,Php,Mysql,String,Yii2,Pivot,例如我有一张桌子 +----+---------+ | gid| name | +----+---------+ | 1 | stan | | 1 | kyle | | 2 | kenny | | 3 | cartman | | 3 | john | | 3 | myley | +----+---------+ 我需要这个结果: +----+-------------+ | 1 | 2 | 3 | |stan|kenny|cartma

例如我有一张桌子

+----+---------+
| gid|  name   |
+----+---------+
|  1 | stan    |
|  1 | kyle    |
|  2 | kenny   |
|  3 | cartman |
|  3 | john    |
|  3 | myley   |
+----+---------+ 
我需要这个结果:

+----+-------------+
|  1 |  2  |  3    |
|stan|kenny|cartman|
|kyle|null |john   | 
|null|null |myley  |
+----+-------------+ 
作为阵列:

[
 [1,2,3],
 [stan,kenny, cartman],
 [kyle, null, john],  
 [null,null,myley]
]

如果在MYSQL中不可能,那么如何在PHP中使用数组来实现这一点呢?谢谢

这样的可能性在应用程序端可能会得到更好的处理。。。但在SQL中使用窗口函数(MySQL 8.0中提供)是可行的:


这样的可能性可能会在应用程序端得到更好的处理。。。但在SQL中使用窗口函数(MySQL 8.0中提供)是可行的:


如果你有mysql 8,你可以使用第一个

但是,当您拥有灵活数量的GUI时,您可以使用第二个GUI,这将生成一个透视表

1 | 2 | 3 :--- | :---- | :------ 斯坦|肯尼|卡特曼 凯尔| |约翰 ||迈利
dbfiddle

如果您有mysql 8,则可以使用第一个

但是,当您拥有灵活数量的GUI时,您可以使用第二个GUI,这将生成一个透视表

1 | 2 | 3 :--- | :---- | :------ 斯坦|肯尼|卡特曼 凯尔| |约翰 ||迈利
dbfiddle

如前所述,虽然在sql中是可能的,但在PHPT中它更简单(并且更容易扩展)。作为一个需求,这看起来相当混乱。在数据行中,列之间没有实际的关系,这很奇怪。如果您只是想在某个地方显示它,为什么不遍历每个不同的gid呢?结果的顺序重要吗?第一列的有效结果是Kyle、Stan、NULL吗?谢谢所有的答案,非常感谢!不过我会尝试PHP,因为它在sql中看起来太复杂了。根据前面提到的这个主题找到了很好的解决方案,虽然在sql中是可能的,但在PHPT中它更简单(并且更容易扩展)。作为一个需求,这看起来相当混乱。在数据行中,列之间没有实际的关系,这很奇怪。如果您只是想在某个地方显示它,为什么不遍历每个不同的gid呢?结果的顺序重要吗?第一列的有效结果是Kyle、Stan、NULL吗?谢谢所有的答案,非常感谢!不过,我会尝试使用PHP,因为它在sql中看起来太复杂了。基于此主题找到了很棒的解决方案
select
    max(case when gid = 1 then name end) name1,
    max(case when gid = 2 then name end) name2,
    max(case when gid = 3 then name end) name3
from (
    select t.*, row_number() over(partition by gid order by name) rn
    from mytable t
) t
group by rn
CREATE TABLE table1 (
  `gid` INTEGER,
  `name` VARCHAR(7)
);

INSERT INTO table1
  (`gid`, `name`)
VALUES
  ('1', 'stan'),
  ('1', 'kyle'),
  ('2', 'kenny'),
  ('3', 'cartman'),
  ('3', 'john'),
  ('3', 'myley');
SELECT
MAX(IF (`gid` = 1,  `name`, NULL)) as '1',
MAX(IF (`gid` = 2,  `name`, NULL)) as '2',
MAX(IF (`gid` = 3,  `name`, NULL)) as '3'
FrOM
(SELECT *,
       ROW_NUMBER() OVER (
          PARTITION BY `gid`
          ) row_num
          FROM table1) t1
GROUP BY row_num
1 | 2 | 3 :--- | :---- | :------ stan | kenny | cartman kyle | null | john null | null | myley
SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
               CONCAT('MAX(IF (`gid` = "', `gid`,'", `name`,"")) AS "',gid,'"')
              ) INTO @sql
FROM (SELECT *,
       ROW_NUMBER() OVER (
          PARTITION BY `gid`
          ) row_num
          FROM table1) t1;


SET @sql = CONCAT('SELECT   ', @sql, ' 
                  FROM (SELECT *,
       ROW_NUMBER() OVER (
          PARTITION BY `gid`
          ) row_num
          FROM table1) t1
                 GROUP BY row_num
                 ');
#SELECT @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE stmt;
1 | 2 | 3 :--- | :---- | :------ stan | kenny | cartman kyle | | john | | myley