【问题标题】:How to get matrix of mySQL table如何获取 mySQL 表的矩阵
【发布时间】:2014-12-04 11:09:09
【问题描述】:

我有一个简单的表格来描述这样的单元格。此表 cells 包含 3 个字段:column_idrow_idvalue。此表不能为同一对 (column_id, row_id) 设置值。

例如,这包含这些值:

id  column_id   row_id   value
1   0           0        'a'
2   0           1        'b'
3   1           0        'c'

这里的示例非常“简单”,但有超过 20.000 行和 50 列。

我正在寻找一种快速的方法来获取矩阵形式的结果,就像 Excel 所做的那样:

row_id   column_0   column_1
0        'a'        'c'
1        'b'         NULL

现在,我用一组 SELECT 成功了,像这样

SELECT row_id,
  SELECT (value FROM cells AS cells_row_1 WHERE cells.row_id=cells_row_1.row_id AND column_id=1) AS column_1,
  SELECT (value FROM cells AS cells_row_2 WHERE cells.row_id=cells_row_2.row_id AND column_id=2) AS column_2
FROM cells

此查询不可读且未优化。 你有更好的主意吗?

问候

【问题讨论】:

  • 我认为没有更好的方法。

标签: mysql sql select optimization pivot


【解决方案1】:

试试这个:

SELECT row_id, 
       MAX(CASE WHEN c.column_id = 1 THEN c.value ELSE '' END) AS column_1, 
       MAX(CASE WHEN c.column_id = 2 THEN c.value ELSE '' END) AS column_2
FROM cells c
GROUP BY c.row_id;

如果您想动态获取列,请使用以下代码:

SELECT GROUP_CONCAT('MAX(CASE WHEN c.column_id = ', c.column_id, ' THEN c.value ELSE '''' END) AS column_', c.column_id) INTO @query 
FROM (SELECT DISTINCT column_id FROM cells c) AS c;

SET @s = CONCAT("SELECT row_id, ", @query,  "FROM cells c GROUP BY c.row_id;");

PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

【讨论】:

    猜你喜欢
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多