Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 选择MYSQL行,但将行分为列,将列分为行_Php_Mysql - Fatal编程技术网

Php 选择MYSQL行,但将行分为列,将列分为行

Php 选择MYSQL行,但将行分为列,将列分为行,php,mysql,Php,Mysql,我想选择数据库中的所有行,但我希望它们按相反的顺序排列。也就是说,我希望使用第一列数据作为新实体,使用当前实体作为第一列。我想你明白我的意思了 这是一个例子 id | name | marks ------------------------------- 1 | Ram | 45 -------------------------------- 2 | Shyam | 87 到 在命令行中,您可以使用\G结束

我想选择数据库中的所有行,但我希望它们按相反的顺序排列。也就是说,我希望使用第一列数据作为新实体,使用当前实体作为第一列。我想你明白我的意思了

这是一个例子

id    |     name       | marks
-------------------------------
1     |    Ram         | 45
--------------------------------
2     |    Shyam       |  87


在命令行中,您可以使用\G结束查询以实现此目的 e、 g


听起来您正在寻找的是对数据的交叉表(或转置)操作


这里有一篇优秀的文章描述了如何做到这一点:-虽然有点过时,但不确定现在是否有更有效的方法来做到这一点。它对我来说已经足够好了。

对于一个固定的已知列,下面是如何做到的(我冒昧地将表命名为“grades”):

总体思路: 创建并执行不同查询的联合

由于需要实际数据作为列标题,因此联合体的第一部分如下所示:

SELECT 'id', '1', '2', ....
SELECT 'Marks',
    (SELECT Marks FROM grades LIMIT 0, 1),
    (SELECT Marks FROM grades LIMIT 1, 1),
    (SELECT Marks FROM grades LIMIT 2, 1),
    ...
该查询本身将复制结果,因此我们需要通过添加
limit0,0
来告诉MySQL我们需要0行

union的第一行将包含
“Name”
,以及表中“Name”列中的所有数据。要获得该行,我们需要一个如下查询:

SELECT 'Name',
    (SELECT Name FROM grades LIMIT 0, 1),
    (SELECT Name FROM grades LIMIT 1, 1),
    (SELECT Name FROM grades LIMIT 2, 1),
    ...
使用相同的逻辑,我们的第二行将如下所示:

SELECT 'id', '1', '2', ....
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;
为了获得该行,我们将使用和函数:

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),
    ...
SET @a = -1;
SELECT @a:=@a+1 FROM grades;
由于我们事先不知道原始表中有多少行,我们将使用变量生成不同的
LIMIT x,1
语句。它们可以使用以下方法生产:

SELECT 'Name',
    (SELECT Name FROM grades LIMIT 0, 1),
    (SELECT Name FROM grades LIMIT 1, 1),
    (SELECT Name FROM grades LIMIT 2, 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
我们将把它与第一列数据(第二列的名称)一起放入变量names@line1中:

按照相同的逻辑,第二行将是:

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()
创建最后一个变量,将其作为新查询准备并执行:

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) +-------+------+-------+ |id | 1 | 2| +-------+------+-------+ |姓名|拉姆|希亚姆| |马克| 45 | 87| +-------+------+-------+ 一组2行(0.00秒) 结束语:
  • 我仍然不确定为什么需要将行转换为列,而且我确定我提出的解决方案不是最好的(就性能而言)

  • 您甚至可以使用我的解决方案作为起点,并将其调整为一个通用解决方案,在该解决方案中,表列名(以及行数)未知,使用
    信息\u schema
    作为源,但我想这太过分了

  • 我坚信最好将原始表放入数组中,然后旋转该数组,从而获得所需格式的数据


您需要PHP中的倒序吗?在SQL中,我想它没有任何意义…签出-但是你能解释一下为什么你想要这个吗?可能有更好的解决方案。@kaavier,我知道如何在PHP中实现它?但我需要一个sql解决方案,这可能无法在mySQL中完成。这不是它的设计目的。很有趣。但我不认为这是op想要的。它将每一行显示为一个块,而不是每一行并排显示。我不确定这是否适用于php的mysql函数,但这是我所知道的最接近的:)