P粉0463871332023-08-23 11:13:47
我有一种稍微不同的方法来完成这个任务,与接受的答案不同。这种方法可以避免使用默认情况下有1024个字符限制的GROUP_CONCAT,并且如果你有很多字段,它将无法工作,除非你改变限制。
SET @sql = ''; SELECT @sql := CONCAT(@sql,if(@sql='','',', '),temp.output) FROM ( SELECT DISTINCT CONCAT( 'MAX(IF(pa.fieldname = ''', fieldname, ''', pa.fieldvalue, NULL)) AS ', fieldname ) as output FROM product_additional ) as temp; SET @sql = CONCAT('SELECT p.id , p.name , p.description, ', @sql, ' FROM product p LEFT JOIN product_additional AS pa ON p.id = pa.id GROUP BY p.id, p.name, p.description'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
P粉7680455222023-08-23 00:34:41
在MySQL中,唯一动态执行此操作的方法是使用预处理语句。以下是一篇关于它们的好文章:
你的代码将如下所示:
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(IF(pa.fieldname = ''', fieldname, ''', pa.fieldvalue, NULL)) AS ', fieldname ) ) INTO @sql FROM product_additional; SET @sql = CONCAT('SELECT p.id , p.name , p.description, ', @sql, ' FROM product p LEFT JOIN product_additional AS pa ON p.id = pa.id GROUP BY p.id, p.name, p.description'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
查看演示
注意:GROUP_CONCAT函数的字符限制为1024个字符。请参阅参数group_concat_max_len