【问题标题】:To retrieve values from multiple rows into a single row from a single table under multiple columns将多行中的值检索到多列下的单个表中的单行中
【发布时间】:2013-04-30 07:47:13
【问题描述】:

这是我的问题的示例表:

数据库:MySql 5.1
表名:教育

id edutype 大学科目 年及格分数
200 1 CBSE 数学、科学、英语、印地语 2002 78.00
200 2 CBSE 数学、物理、化学、生物学 2004 68.00
200 3 WBUT 计算机科学工程 2008 87.00
100 1 ICSE 数学、科学、英语、印地语 2001 72.00
100 2 CBSE 数学、物理、化学、生物学 2003 65.00
100 3 NIT 电子工程 2008 75.00
300 1 CBSE 数学、科学、英语、印地语 2003 65.00
300 2 CBSE 数学、物理、化学、生物学 2005 63.00
300 3 VIT冶金工程 2009 79.00

现在我想运行一个 sql 查询,它将以以下格式输出结果:

id uvr1 sub1 yop1 pcm1 uvr2 sub2 yop2 pcm2 uvr3 sub3 yop3 pcm3
200 CBSE 数学、科学、英语、印地语 2002 78.00 CBSE 数学、物理、化学、生物学 2004 68.00 WBUT 计算机科学工程 2008 87.00
100 ICSE 数学、科学、英语、印地语 2001 72.00 CBSE 数学、物理、化学、生物学 2003 65.00 NIT 电子工程 2008 75.00
300 CBSE 数学、科学、英语、印地语 2003 65.00 CBSE 数学、物理、化学、生物学 2005 63.00 VIT 冶金工程 2009 79.00

如果您有任何好的方法来实现这一点,请分享,需要您的帮助。

提前致谢

【问题讨论】:

  • 这种操作确实属于你的应用程序的表现层。

标签: mysql sql join


【解决方案1】:

你可以试试这个:

SELECT 
    e1.id,
    e1.university as uvr1,
    e1.subjects as sub1,
    e1.yearofpass as yop1,
    e1.percentmarks as pcm1,
    e2.university as uvr2,
    e2.subjects as sub2,
    e2.yearofpass as yop2,
    e2.percentmarks as pcm2,
    e3.university as uvr3,
    e3.subjects as sub3,
    e3.yearofpass as yop3,
    e3.percentmarks as pcm3
FROM 
    Education as e1
LEFT JOIN Education as e2
    ON e1.id = e2.id
    AND e2.edutype = e1.edutype+1
LEFT JOIN Education as e3
    ON e1.id = e3.id
    AND e3.edutype = e1.edutype+2
WHERE
    e1.edutype = 1

但是...这仅适用于您没有更多具有相同 ID 的 3 所大学,如果您有更多需要添加额外的连接。

另外看看你的表结构我认为你应该阅读更多关于Database Normalization它可以帮助你。

你可以这样做:

【讨论】:

  • 感谢 stephan....您的代码有效并为我提供了所需的输出。关于规范化,您认为我的表格应该如何构建才能适合我的要求。在这种情况下,我没有超过 2NF。因为我指的是两个以 edutype 为关键属性的表。
  • np...我已经为数据添加了一个可能的结构
【解决方案2】:

您可以尝试 CONCAT 和 SUBSTRING 函数以及嵌套的 SELECT。 喜欢:

SELECT SUBSTRING(CONCAT(subjects, 
(
SELECT subjects FROM education WHERE university=CBSE and rownum=2
)),0,27) 
FROM education WHERE university='CBSE' and rownum=1;

但这是非常糟糕且不一致的解决方案。在你的位置,我会尝试重新组织选择的要求。也许你提到的这样的输出是不必要的。

【讨论】:

  • 实际上,我需要这种输出,以便我可以将它们导出到 Excel 工作表中。
【解决方案3】:

虽然以下形式的 PIVOT TABLE 查询在 MySQL 中是完全可能的,但在大多数情况下,最好按照 eggyal 的建议在应用程序级别处理此类事情......

SELECT id
     , MAX(CASE WHEN edutype = 1 THEN university END) uvr1
     , MAX(CASE WHEN edutype=1 THEN subjects END) sub1 
  FROM education 
 GROUP 
    BY id;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多