php – 选择MYSQL行,但行为列,列为行
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – 选择MYSQL行,但行为列,列为行,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3794字,纯文字阅读大概需要6分钟。
内容图文
我想选择数据库中的所有行,但我希望它们按顺序排列.意思是,我想使用第一列数据作为新实体,并将实体作为第一列.我想你明白了我的意思
这是一个例子
id | name | marks
-------------------------------
1 | Ram | 45
--------------------------------
2 | Shyam | 87
至
id | 1 | 2 |
----------------------------
Name | Ram | Shyam |
----------------------------
Marks | 45 | 87 |
解决方法:
使用固定和已知的列,这里是如何做到的(我冒昧地命名表“成绩”):
大概的概念:
创建不同查询的并集并执行它.
由于您需要实际数据作为列标题,因此联合的第一部分将如下所示:
SELECT 'id', '1', '2', ....
单独的查询将复制结果,因此我们需要通过添加LIMIT 0,0告诉MySQL我们需要有0行.
我们的第一行联合将包含“名称”,以及表格“名称”列中的所有数据.要获得该行,我们需要一个类似的查询:
SELECT 'Name',
(SELECT Name FROM grades LIMIT 0, 1),
(SELECT Name FROM grades LIMIT 1, 1),
(SELECT Name FROM grades LIMIT 2, 1),
...
使用相同的逻辑,我们的第二行将如下所示:
SELECT 'Marks',
(SELECT Marks FROM grades LIMIT 0, 1),
(SELECT Marks FROM grades LIMIT 1, 1),
(SELECT Marks FROM grades LIMIT 2, 1),
...
获得标题:
我们需要从MySQL生成一行,如:
SELECT 'id', '1', '2', ... LIMIT 0, 0;
要获得该行,我们将使用CONCAT()和GROUP_CONCAT()函数:
SELECT 'id',
(SELECT GROUP_CONCAT(CONCAT(' \'', id, '\'')) FROM grades)
LIMIT 0, 0;
我们要将该行存储到一个新变量中:
SET @header = CONCAT('SELECT \'id\', ',
(SELECT GROUP_CONCAT(CONCAT(' \'', id, '\'')) FROM grades),
' LIMIT 0, 0');
创建线条:
我们需要创建两个查询,如下所示:
SELECT 'Name',
(SELECT Name FROM grades LIMIT 0, 1),
(SELECT Name FROM grades LIMIT 1, 1),
(SELECT Name FROM grades LIMIT 2, 1),
...
由于我们事先并不知道原始表中有多少行,因此我们将使用变量生成不同的LIMIT x,1语句.它们可以使用以下方法生产:
SET @a = -1;
SELECT @a:=@a+1 FROM grades;
使用此代码段,我们可以创建子查询:
SELECT GROUP_CONCAT(
CONCAT(' (SELECT name FROM grades LIMIT ',
@a:=@a+1,
', 1)')
)
FROM grades
我们将把变量名称@ line1和第一列数据(这是第二列的名称)放在一起:
SET @a = -1;
SET @line1 = CONCAT(
'SELECT \'Name\',',
(
SELECT GROUP_CONCAT(
CONCAT(' (SELECT Name FROM grades LIMIT ',
@a:=@a+1,
', 1)')
)
FROM grades
));
按照相同的逻辑,第二行将是:
SET @a := -1;
SET @line2 = CONCAT(
'SELECT \'Marks\',',
(
SELECT GROUP_CONCAT(
CONCAT(' (SELECT Marks FROM grades LIMIT ',
@a:=@a+1,
', 1)')
)
FROM grades
));
将它们组合在一起:
我们的三个变量现在包含:
@header:
SELECT 'id', '1', '2' LIMIT 0, 0
@line1:
SELECT 'Name', (SELECT Name FROM grades LIMIT 0, 1),
(SELECT name FROM grades LIMIT 1, 1)
@line2:
SELECT 'Marks', (SELECT Marks FROM grades LIMIT 0, 1),
(SELECT marks FROM grades LIMIT 1, 1)
我们只需要使用CONCAT()创建一个final变量,将其准备为新查询并执行它:
SET @query = CONCAT('(',
@header,
') UNION (',
@line1,
') UNION (',
@line2,
')'
);
PREPARE my_query FROM @query;
EXECUTE my_query;
整个方案:
(用于测试和参考):
SET @header = CONCAT('SELECT \'id\', ',
(SELECT GROUP_CONCAT(CONCAT(' \'', id, '\'')) FROM grades),
' LIMIT 0, 0');
SET @a = -1;
SET @line1 = CONCAT(
'SELECT \'Name\',',
(
SELECT GROUP_CONCAT(
CONCAT(' (SELECT Name FROM grades LIMIT ',
@a:=@a+1,
', 1)')
)
FROM grades
));
SET @a := -1;
SET @line2 = CONCAT(
'SELECT \'Marks\',',
(
SELECT GROUP_CONCAT(
CONCAT(' (SELECT Marks FROM grades LIMIT ',
@a:=@a+1,
', 1)')
)
FROM grades
));
SET @query = CONCAT('(',
@header,
') UNION (',
@line1,
') UNION (',
@line2,
')'
);
PREPARE my_query FROM @query;
EXECUTE my_query;
输出:
+-------+------+-------+ | id | 1 | 2 | +-------+------+-------+ | Name | Ram | Shyam | | Marks | 45 | 87 | +-------+------+-------+ 2 rows in set (0.00 sec)
结束思路:
>我仍然不确定为什么需要将行转换为列,我确信我提出的解决方案不是最好的(就性能而言).
>您甚至可以使用我的解决方案作为开始,并使用information_schema.COLUMNS作为源,将其调整为通用解决方案,其中表列名称(和行数)未知,但我想这只是太过分了.
>我坚信最好将原始表放入数组然后旋转该数组,从而获得所需格式的数据.
内容总结
以上是互联网集市为您收集整理的php – 选择MYSQL行,但行为列,列为行全部内容,希望文章能够帮你解决php – 选择MYSQL行,但行为列,列为行所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。