2017-02-17 102 views
0

我曾尝试MySQL的ststement为dinamically rows to column通过随后here与查询语句:GROUP_CONCAT MySQL的语句错误

SET @sql = NULL; 
SELECT 
GROUP_CONCAT(DISTINCT 
    CONCAT(
    'MAX(CASE WHEN col = ''', 
    col, 
    ''' THEN val END) as `', 
    col, '`' 
) 
)INTO @sql 
FROM 
(
    SELECT A.id_a, D.id_c id_c, 
      C.students students, 
      CONCAT(B.`code`, '_', A.id_a) col, 
      CONCAT(D.value_m, ',', D.value_n) val 
    FROM table_a A 
     INNER JOIN table_d D ON A.id_a =D.id_a 
     INNER JOIN table_b B ON D.id_b=B.id_b 
     INNER JOIN table_c C ON D.id_c=C.id_c 
)dd; 

SET @sql = CONCAT('SELECT id_c, students,', @sql, ' 
     FROM(
      SELECT A.id_a, D.id_c id_c, 
       C.students students, 
       CONCAT(B.`code`, '_', A.id_a) col, 
       CONCAT(D.value_m, ',', D.value_n) val 
      FROM table_a A 
       INNER JOIN table_d D ON A.id_a =D.id_a 
       INNER JOIN table_b B ON D.id_b=B.id_b 
       INNER JOIN table_c C ON D.id_c=C.id_c 
     )dd 
     GROUP BY id_c' 
    ); 

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

与结果消息:

Query OK, 0 rows affected 
Query OK, 1 row affected 
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 '', A.id_a) col, 
      CONCAT(D.value_m, ',', D.value_n) val 
     FROM table_a A ' at line 1 
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 'MAX(CASE WHEN col = 'MAT_1' THEN val END) as `MAT_1`,MAX(CASE WHEN col = 'BIO_1'' at line 1 
1243 - Unknown prepared statement handler (stmt) given to EXECUTE 
1243 - Unknown prepared statement handler (stmt) given to DEALLOCATE PREPARE 

我不熟悉这样的SQL语句,和什么是错误的SQL QUERY

谢谢...

回答

1

如果你看看你的代码(放大):

SET @sql = CONCAT('SELECT id_c, students,', @sql, ' 
     [..] 
       CONCAT(B.`code`, '_', A.id_a) col, 
       CONCAT(D.value_m, ',', D.value_n) val 
     [..] 
     GROUP BY id_c' 
    ); 

你会看到_,是黑色的,而他们应该是红色作为字符串的一部分。这意味着你的字符串在那里“破碎”了。所以,你需要''逃脱单引号:

SET @sql = CONCAT('SELECT id_c, students,', @sql, " 
     [..] 
       CONCAT(B.`code`, '_', A.id_a) col, 
       CONCAT(D.value_m, ',', D.value_n) val 
     [..] 
     GROUP BY id_c" 
    ); 

现在整个字符串是红色的,因为它应该是:-)

:字符串包含单引号

SET @sql = CONCAT('SELECT id_c, students,', @sql, ' 
     [..] 
       CONCAT(B.`code`, ''_'', A.id_a) col, 
       CONCAT(D.value_m, '','', D.value_n) val 
     [..] 
     GROUP BY id_c' 
    ); 

或者用双引号

http://rextester.com/SLMU41976

+0

好不错......我没有看到“破”在那里:-) ...谢谢.. – Anz