栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

使用固定的已知列,这里是做这的方法(我将表命名为“ grades”是自由的):

大概的概念:

创建并执行不同查询的并集。

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

SELECt 'id', '1', '2', ....

仅该查询将复制结果,因此我们需要通过添加告诉MySQL我们需要有0行

LIMIT 0, 0

联合的第一行将包含

'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 '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()
,将其准备为新查询并执行即可:

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 |+ ------- + ------ + ------- +| 姓名| 拉姆| Shyam || 商标| 45 | 87 |+ ------- + ------ + ------- +设置2行(0.00秒)

结束语:

  • 我仍然不确定为什么需要将行转换为列,并且我确定我提出的解决方案并不是最佳的解决方案(就性能而言)。

  • 您甚至可以使用我的解决方案作为开始,并使之适应于不知道表列名称(和行数)的通用解决方案

    information_schema
    COLUMNS
    作为来源,但我想这太过分了。

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390682.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号