微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我怎么能得到这个结果?

如何解决我怎么能得到这个结果?

例如我有桌子

+----+---------+
| 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,myley]
]

如果在MysqL中不可能,那么怎么用PHP中的数组来做到这一点呢?谢谢

解决方法

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

但是,如果您的gui数量灵活,则可以使用第二个,这将创建一个数据透视表

CREATE TABLE table1 (
  `gid` INTEGER,`name` VARCHAR(7)
);

INSERT INTO table1
  (`gid`,`name`)
VALUES
  ('1','stan'),('1','kyle'),('2','kenny'),('3','cartman'),'john'),'myley');
SELECT
MAX(IF (`gid` = 1,`name`,NULL)) as '1',MAX(IF (`gid` = 2,NULL)) as '2',MAX(IF (`gid` = 3,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`,'","")) 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  

db 提琴here

,

这种可能性在应用程序端可能会得到更好的处理...但是使用窗口函数(在MySQL 8.0中可用)在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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。