您的要求是从产品中透视数据并Product_additional 表,其中的列根据product_additional 表中的值动态填充。当前的查询使用 IF() 条件聚合,不是动态的,需要在添加每个新字段时手动更改。
为了在 MySQL 中实现动态透视,我们可以使用准备好的语句,它允许我们在运行时构造查询字符串。以下代码演示了这种方法:
-- Initialize @sql variable SET @sql = NULL; -- Dynamically create the query string by iterating over distinct `fieldname` values SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(IF(pa.fieldname = ''', fieldname, ''', pa.fieldvalue, NULL)) AS ', fieldname ) ) INTO @sql FROM product_additional; -- Concatenate the constructed string with the base query 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 the query PREPARE stmt FROM @sql; -- Execute the prepared query EXECUTE stmt; -- Deallocate the prepared statement DEALLOCATE PREPARE stmt;
此代码根据product_additional 表中的唯一字段名值生成动态查询字符串。然后使用该字符串构造 PREPARE 语句,执行该语句,然后释放该语句。
请注意,GROUP_CONCAT 函数的字符限制为 1024 个字符。您可以通过设置 group_concat_max_len 参数来增加此限制。
以上是如何使用准备好的语句创建动态 MySQL 数据透视表查询?的详细内容。更多信息请关注PHP中文网其他相关文章!