如何解决我怎么能得到这个结果?
例如我有桌子
+----+---------+
| 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 举报,一经查实,本站将立刻删除。