gpt4 book ai didi

php - 如何将行变成列?

转载 作者:可可西里 更新时间:2023-11-01 07:36:08 27 4
gpt4 key购买 nike

我有一个数据库,我在其中存储按项目分组的关键字和与每个关键字相关的数据,然后我显示每个项目的数据网格,每个关键字一行,几列都从同一个表“数据”中检索。我有 4 个表、关键字、项目、group_keywords 和数据。 “keywords”只存储关键字,“projects”是项目名称,“group_keywords”是分配给该项目的关键字的关键字id,“data”是每个关键字的所有数据所在的地方,由关键字的外键标识.id,以及用于标识数据名称的名称列。

现在要检索关键字 + 我使用此查询的项目的所有数据:

SELECT * FROM `group_keywords` 
INNER JOIN keywords on keywords.id = keyword_id
INNER JOIN data ON data.id = keywords.id
WHERE `group_id` = (SELECT `id` FROM `projects` WHERE `name` = 'ProjectName'

这给了我类似的东西

    id  group_id    keyword_id  id  keyword     id  name    value
12 5 52 52 absorption food 52 data_name_x1 6
12 5 52 52 absorption food 52 data_name_x2 8
12 5 52 52 absorption food 52 data_name_x3 26
12 5 52 52 absorption food 52 data_name_x4 2
...

但我想要的是:

id  group_id    keyword_id  id  keyword id  data_name_x1    data_name_x2    data_name_x3    data_name_x4
12 5 52 52 absorption food 52 6 8 26 2
...

所以我可以轻松地对数据网格进行排序和使用分页,否则我不知道该怎么做,因为在使用大数据集时我不能将所有内容都转储到数组中,数据太多了。

这是模式:

-- --------------------------------------------------------
-- Table structure for table `keywords`

CREATE TABLE IF NOT EXISTS `keywords` (
`id` int(10) unsigned NOT NULL auto_increment,
`keyword` varchar(255) NOT NULL,
UNIQUE KEY `id` (`id`),
UNIQUE KEY `keyword` (`keyword`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=115386 ;


-- --------------------------------------------------------
-- Table structure for table `data`

CREATE TABLE IF NOT EXISTS `data` (
`id` int(10) unsigned NOT NULL,
`name` varchar(100) NOT NULL,
`value` varchar(15) NOT NULL,
UNIQUE KEY `id` (`id`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


-- --------------------------------------------------------
-- Table structure for table `projects`
--

CREATE TABLE IF NOT EXISTS `projects` (
`id` int(10) NOT NULL auto_increment,
`name` varchar(100) NOT NULL,
`parent` varchar(100) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=21 ;


-- --------------------------------------------------------
-- Table structure for table `group_keywords`

CREATE TABLE IF NOT EXISTS `group_keywords` (
`id` int(10) NOT NULL auto_increment,
`group_id` int(10) NOT NULL,
`keyword_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `group_id` (`group_id`,`keyword_id`),
KEY `keyword_id` (`keyword_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=119503 ;


-- --------------------------------------------------------
-- Constraints for table `data`
--
ALTER TABLE `data`
ADD CONSTRAINT `data_ibfk_1` FOREIGN KEY (`id`) REFERENCES `keywords` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- --------------------------------------------------------
-- Constraints for table `group_keywords`
--
ALTER TABLE `group_keywords`
ADD CONSTRAINT `group_keywords_ibfk_1` FOREIGN KEY (`keyword_id`) REFERENCES `keywords` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

最佳答案

这个操作传统上称为“unpivot”,一些 RDBMS 支持它,但 MySQL 似乎不是其中之一。您有两个选择,使用 SQL 或使用 PHP。在 MySQL 中,自连接看起来像这样(我不知道哪个字段符合您的 ID 字段,所以请原谅我创建自己的示例)。从性能的角度来看,请确保您对 ID 和列名都建立了索引,否则这些连接将被抓取。

shapes
ID Name Value
1 Color Red
1 Shape Circle
... for more "columns"
2 Color Green
2 Shape Square
... for more "columns"

SELECT
A.ID,
B.Value as Color,
C.Value as Shape
... for more "columns"
FROM shapes A
LEFT JOIN shapes B ON B.ID = A.ID AND B.Name = 'Color'
LEFT JOIN shapes C ON C.ID = A.ID AND C.Name = 'Shape'
... for more "columns"

应该让我们联网(除非我的 head-SQL-parser 今晚运行不正常):

ID  Color   Shape
1 Red Circle
2 Green Square

对于 PHP 版本,您不一定必须加载数组,您可以流式传输它。按 PK 排序并逐步设置属性。在伪代码中:

Set X to undefined
Get a Record
Check the ID property, if it's different than X, create a new object, set X to the new ID, and yield the previous object
Set the property of the object based on the "Name" column of our result

希望这对您有所帮助!

关于php - 如何将行变成列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3740616/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com