mysql - 我们可以使用 sql 数据字段作为列名吗?

标签 mysql

先查询

SELECT * FROM mytable WHERE id='1'

例如给我一定数量的行

id             |       context      |      cat     |    value
1                     Context 1            1           value 1
1                     Context 2            1           value 2
1                     Context 1            2           value 3
1                     Context 2            2           value 4

现在我的问题不是以这种方式接收结果 我希望它是这样的

id      |   cat    |    Context 1     |  Context 2   
1            1           value 1          value 2       
1            2           value 3          value 4    

最佳答案

@updated - 请参阅代码块 3 (MySQL) 中的注释 #,它仅用于从控制台或 HeidiSQL 进行调试

您正在寻找的东西称为旋转。 您没有说明这是在什么 DBMS 上,但是对于 SQL Server,请在联机丛书中查找 PIVOT 运算符 - 如果类别是固定的,它可能会起作用。 如果没有,那么你需要动态 sql,比如

declare @sql nvarchar(max);

-- generate the column names
select @sql = coalesce(@sql + ',', '') + QuoteName(context)
from (select distinct context from mytable) T;

-- replace the column names into the generic PIVOT form
set @sql = REPLACE('
select id, cat, :columns:
from (select id, cat, context, value From mytable) p
pivot (max(value) for context in (:columns:)) pv',
':columns:', @sql)

-- execute for the results
exec (@sql)

测试数据

create table mytable (id int, context varchar(10), cat int, value varchar(20))
insert mytable select 1 ,'Context 1', 1 ,'value 1'
insert mytable select 1 ,'Context 2', 1 ,'value 2'
insert mytable select 1 ,'Context 1', 2 ,'value 3'
insert mytable select 1 ,'Context 2', 2 ,'value 4'

以上是针对 SQL Server 的。对于 MySQL,请改用它,它遵循相同的技术。

SELECT @sql := NULL;
SELECT @sql := group_concat(
    'max(case when context=''',
    replace(context,'''',''''''),
    ''' then value end) `',
    replace(context,'`','``'),
    '`')
from (select distinct context from mytable) T;
SELECT @sql := concat(
    'select id, cat,',
    @sql,
    ' from mytable group by id, cat');
# SELECT @sql; # commented out, PHP sees this as the first result
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

根据您的测试数据,加上两个 curl (引号和反引号):

create table mytable (id int, context varchar(10), cat int, value varchar(20));
insert mytable select 1 ,'Context 1', 1 ,'value 1';
insert mytable select 1 ,'Context 2', 1 ,'value 2';
insert mytable select 1 ,'Context 1', 2 ,'value 3';
insert mytable select 1 ,'Context 2', 2 ,'value 4';
insert mytable select 1 ,'Context''3', 1 ,'quote';
insert mytable select 1 ,'Context`4', 2 ,'backquote';

关于mysql - 我们可以使用 sql 数据字段作为列名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4680046/

相关文章:

mysql - 在优化 SQL 查询方面需要帮助

mysql - 如何计算MySQL中的相似兴趣

mySQL:如何填写此问题 - 答案表

mysql - 带有子选择和多行的 SQL 插入

mysql - 如何在连接中转换这个子查询?

mysql - 需要查询来检索与另一表连接的一个表中的所有行

Java线程与MYSQL的不解

php - 将秒数相加

mysql - "..."中的未知列 "where clause"

mysql - 更新数据库用户的权限对现有连接有什么影响?