使用过程MySQL创建视图时出错

使用过程MySQL创建视图时出错,mysql,view,pivot-table,procedure,Mysql,View,Pivot Table,Procedure,尝试使用过程创建视图时出现问题。我必须这样做,因为我需要在MySQL中创建一个透视,将一个表的行转换为另一个表的列。 这个查询工作得很好,但是当我把它放在“createview”语句中时,它给了我一个错误 下面是带有CREATE视图的查询 CREATE VIEW `Untitled` AS SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(IF(formazioni_persone.id_formazi

尝试使用过程创建视图时出现问题。我必须这样做,因为我需要在MySQL中创建一个透视,将一个表的行转换为另一个表的列。 这个查询工作得很好,但是当我把它放在“createview”语句中时,它给了我一个错误

下面是带有CREATE视图的查询

CREATE VIEW `Untitled` AS 
SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(IF(formazioni_persone.id_formazione = ',
      formazioni.id,
      ', true, false)) AS "',
      formazioni.titolo,'"'
    )
  ) INTO @sql
FROM formazioni;

SET @sql = CONCAT('SELECT persone.*, ', @sql, ' FROM persone INNER JOIN formazioni_persone ON persone.id = formazioni_persone.id_persona GROUP BY persone.id');

PREPARE stmt1 FROM @sql; 

EXECUTE stmt1; 

DEALLOCATE PREPARE stmt1;
没有创建视图的查询
Untitled
AS效果很好

没有创建视图的查询
无标题
效果很好。我已经尝试在create视图中创建一个临时表,但是什么都没有。也尝试过使用这样的分隔符,但什么都没有

DELIMITER $$ 
CREATE VIEW `Untitled` AS 
SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(IF(formazioni_persone.id_formazione = ',
      formazioni.id,
      ', true, false)) AS "',
      formazioni.titolo,'"'
    )
  ) INTO @sql
FROM formazioni;

SET @sql = CONCAT('SELECT persone.*, ', @sql, ' FROM persone INNER JOIN formazioni_persone ON persone.id = formazioni_persone.id_persona GROUP BY persone.id');

PREPARE stmt1 FROM @sql; 

EXECUTE stmt1; 

DEALLOCATE PREPARE stmt1;
END $$ 
DELIMITER ;

错误:1064-您的SQL语法有错误;查看与MySQL服务器版本对应的手册,了解在第2行“SET@sql=NULL”附近使用的正确语法,时间:0.082000s。视图只是一个SELECT语句,在定义视图时必须有固定的列。您不能创建同时也是过程的视图

抱歉,如果需要透视表,则需要为查询中的每列指定值。您不能进行选择查询,也不能创建在查找潜在未来值时动态添加更多列的视图

而且无论如何,您也不能定义运行任意程序代码块的视图。这需要一个程序

您应该只使用问题中已经显示的解决方案,如

没有其他捷径或解决办法

顺便说一下,所有SQL数据库都有这个限制,不仅仅是MySQL


你的问题是:

我正在寻找一种不需要手动更新查询的解决方案

数据透视表查询在选择列表中的列数必须与希望其返回的列数相同。没有办法使SQL查询根据执行时读取的数据动态扩展列数

进行单个查询以返回所有数据的唯一方法是不要执行透视表查询,而是返回行中的所有数据,而不是列中的所有数据

SELECT p.*, f.titolo, pf.id_persona IS NOT NULL AS ha_formazioni
FROM persone AS p 
CROSS JOIN formazioni AS f
LEFT OUTER JOIN formazioni_persone AS fp ON fp.id_formazioni AND fp.id_persona = p.id

这将为每个
formazioni
每个
persone
返回一行。然后,您必须在应用程序中编写代码,以循环reesult的所有行,并以您想要的方式格式化列中的数据。

恕我直言,当您凭空编写语法时,它工作的可能性很小。是的,确实如此。但在MySQL中,没有办法实现pivot。我找到的唯一方法是使用IF/CASE。为了动态地实现它(因为我从中获取列的表将发生变化),我认为我没有任何其他解决方案。。。但是任何建议都是值得赞赏的谢谢你,现在明白了。你有什么建议可以让它充满活力吗?查询中的CASE/IF数量将发生变化,我正在寻找一种不需要手动更新查询的解决方案