【问题标题】:Transformation of records 1 column 3 row -> 1 row 3 column记录 1 列 3 行 -> 1 行 3 列的转换
【发布时间】:2010-06-03 15:17:10
【问题描述】:

先看下面的查询

SELECT COUNT(id) AS total_record, id, modeller,
  MONTHNAME(completed_date) AS current_month,
  QUARTER(completed_date) AS current_quarter,
  Difficulty,
  YEAR(completed_date) AS current_year
FROM model
WHERE modeller != ''
  AND completed_date BETWEEN '2010-04-01'
  AND '2010-05-31' AND Difficulty != ''
GROUP BY Difficulty,
MONTH(completed_date) ORDER BY
MONTH(completed_date) ASC

我得到的结果是

Modeller  Month  Year  Difficulty

XYZ       Jan    2010  23

XYZ       Jan    2010  14

XYZ       Jan    2010  15

ABC       Feb    2010   5

ABC       Feb    2010  14

ABC       Feb    2010   6

我想要这样的结果

Modeller  Month  Year  Difficulty

XYZ       Jan    2010  23, 14, 15

ABC       Feb    2010  5, 14, 6

我的数据库是我正在开发的应用程序的 Mysql,所以任何帮助都会非常有用。

谢谢,

【问题讨论】:

    标签: mysql mysqli


    【解决方案1】:

    看看GROUP_CONCAT

    【讨论】:

      【解决方案2】:

      我想你想要GROUP_CONCAT()。我已经简化了您的字段,因此您需要重新添加计算,但应该这样做:

      SELECT modeller, month, year, GROUP_CONCAT(DISTINCT Difficulty)
      FROM Model
      WHERE $conditions
      GROUP BY modeller, month, year
      

      【讨论】:

        【解决方案3】:

        很好,GROUP_CONCAT 函数功能强大,在这种情况下可能是一个完美的解决方案。

        但请注意,在大型系统中,这种操作可能属于应用层而不是数据库查询,从而最大限度地简化维护、重用并减少特定 RDBMS 中的依赖性。

        另一种(更工程化的)等待它使用 DAO 模式。就像http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html中记录的一样

        【讨论】:

        • 数据库供应商更改的可能性低于应用程序代码。 MVC 强调应用层应该用于尽可能少的决策逻辑——仅用于表示。并且数据库将比任何应用程序代码更好地扩展到更大的数据集......那些声称在应用程序代码中更容易维护的人,通常对 SQL 最不满意......
        猜你喜欢
        • 2021-12-22
        • 1970-01-01
        • 2017-11-06
        • 1970-01-01
        • 2020-03-31
        • 1970-01-01
        • 2011-02-11
        • 2019-11-30
        • 2015-05-25
        相关资源
        最近更新 更多