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