将行值转换为列的 MySql 准备语句

标签 mysql prepared-statement

我正在尝试遵循此站点中的示例: http://vitobotta.com/mysql-generate-column-names-dynamically-from-row-values/

我有一张这样的 table :

+------------+--------------+----------+-------------+
| MessageId  | ProcessDate  | FieldName | FieldValue |
+------------+--------------+-----------+------------+
|         18 | 2015-12-04   |  data     | 101110101  |
|         18 | 2015-12-04   |   type    | binary     |
|         19 | 2015-12-04   |   type    | integer    |
|         19 | 2015-12-04   |  data     | 34         |
+------------+--------------+-----------+------------+

我想要的是这样的:

+------------+--------------+----------+-------------+
| MessageId  | ProcessDate  | type      |    data    |
+------------+--------------+-----------+------------+
|         18 | 2015-12-04   |  binar    | 101110101  |
|         19 | 2015-12-04   |  integer  | 34         |
+------------+--------------+-----------+------------+

我的代码:

DROP TABLE IF EXISTS tmp_results;

CREATE TEMPORARY TABLE tmp_results AS
SELECT r.`MessageId`, r.`ProcessDate`, r.`TransportType`, d.`FieldName`, d.`FieldValue`
FROM 
returnmessages r, decodedmessagessummaryrecord s, decodedmessagesdetailrecord d
WHERE r.`Id` = s.`ReturnMessagesId`
AND s.`Id` = d.`DecodedMessagesSummaryRecordId`
AND r.`MobileId` = "35"
LIMIT 10;

SELECT CONCAT('
  SELECT MessageId, ProcessDate, TransportType, ', field_value, '
  FROM tmp_results'
)
INTO @variable1
FROM
(SELECT GROUP_CONCAT(CONCAT('IFNULL(MAX(CASE WHEN FieldName=''',field_name,''' THEN FieldValue
END), ''-'' AS "', col_name,'"')) field_value
FROM(
  SELECT field_name, field_name as col_name
  FROM(SELECT DISTINCT FieldName AS field_name FROM tmp_results) AS fieldnames
  ) field_with_col_names
) result;
PREPARE prepstate FROM @s;

EXECUTE prepstate;

DEALLOCATE PREPARE prepstate;

这会返回一个错误:

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM tmp_results' at line 3

我现在不太确定出了什么问题。

最佳答案

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when FieldName = ''',
      FieldName,
      ''' then FieldValue  end) AS ',
      '`',FieldName,'`'
    )
  ) INTO @sql
from tmp_results;

SET @sql = CONCAT('SELECT MessageId, ProcessDate, TransportType, ', @sql, ' from tmp_results 
group by MessageId');

SELECT @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

FIDDLE

关于将行值转换为列的 MySql 准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37012546/

相关文章:

php - 编码:一切都是 UTF-8,但 DB 输出显示错误。有任何想法吗?

MySQL 将 "select where id in select"更改为某种连接

php - 如何从 mysqli 循环中获取 make session id?

sql - 需要从mysql中包含不同类别的唯一id的表中获取数据

php - MySQLi 更新准备好的语句不更新数据库

sql - Rails 中 Postgresql 的准备语句

php - bind_param() 有什么作用?

PHP PDO Prepared Statement MySQL Count of Select where X LIKE

MySQL SUM 大 TIMEDIFF

php - mysqli_fetch_assoc()需要参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?