【发布时间】:2015-09-23 10:31:04
【问题描述】:
我有以下工作的 MYSQL 查询(它对两个表进行枢轴连接):
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(sk.keywords = ''', sk.keywords,''', kr.rank, NULL)) AS ', CONCAT('`',sk.keywords, '`')
)
) INTO @sql
FROM
search_keywords sk
WHERE sk.product_id = 2 AND sk.active = 'Y';
SET @sql = CONCAT('SELECT eval_date, ', @sql, '
FROM keyword_ranking AS kr
LEFT JOIN search_keywords AS sk
ON kr.search_keywords_id = sk.id
GROUP BY eval_date');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
我想将此查询插入到 java 准备好的语句中。如果我只是复制它,我会得到一个错误的 sql 语法错误:
st = connection.prepareStatement(
"SET @sql = NULL; "
+ "SELECT "
+ "GROUP_CONCAT(DISTINCT "
+ "CONCAT("
+ "'MAX(IF(sk.keywords = ''', sk.keywords,''', kr.rank, NULL)) AS ', CONCAT('`',sk.keywords, '`')"
+ ") INTO @sql "
+ "FROM search_keywords sk "
+ "WHERE sk.product_id = ? AND sk.active = ?; "
+ "SET @sql = CONCAT('SELECT eval_date, ', @sql, ' "
+ "FROM keyword_ranking AS kr "
+ "LEFT JOIN search_keywords AS sk "
+ "ON kr.search_keywords_id = sk.id "
+ "GROUP BY eval_date'); "
+ "PREPARE stmt FROM @sql; "
+ "EXECUTE stmt; "
+ "DEALLOCATE PREPARE stmt; "
);
错误:
错误 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(sk.keywords = CONCAT(''', sk.keyword' ) 附近使用正确的语法
【问题讨论】:
-
只是猜测:Java 可能只允许您在每个查询中执行一条语句。所以在你的情况下,你应该分成多个查询。
-
谢谢 Sirko,但是当我在第二个查询中使用 @SQL 时,如何在 java 中执行此操作?
-
您或许可以考虑将您的 SQL 作为存储过程并从 Java 调用此 SP。
-
请参阅 docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html 以快速了解事务(== 多个连接查询)
标签: mysql jdbc prepared-statement