我有以下工作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预处理语句。如果我只是复制它,我将得到一个misform 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服务器版本对应的手册,以便在'SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF)(sk.keywords = CONCAT(''',sk.keyword'第1行)附近使用正确的语法。
答案 0 :(得分:0)
谢谢@Stan& @Sirko。我相信你们两个都是对的。我首先尝试了交易,但在那里我也遇到了这个错误,所以要么我处理了错误的交易,要么我仍然不得不以某种方式逃避单引号。因为我已经尝试了许多不同的转义变换,所以我要尝试一下存储过程。这有效!!!
对于有兴趣创建存储过程的其他人,我将在下面粘贴我的代码:
在Mysql中存储过程:
CREATE DEFINER=`gobiran`@`%` PROCEDURE `getKeywordHistoryByProductId`(IN PRODUCT_ID INT(11))
BEGIN
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 = PRODUCT_ID 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;
END
调用存储过程:
ResultSet rs = null;
Connection connection = DataBaseHelper.getConnection();
CallableStatement stmt = null;
try {
stmt = connection.prepareCall("{ call getKeywordHistoryByProductId(?) }");
stmt.setInt(1, productId);
rs = stmt.executeQuery();
// Thats it, now work with the Resultset ...
ResultSetMetaData md = rs.getMetaData();
int columns = md.getColumnCount();
List<Object[]> result = new ArrayList<Object[]>();
String[] header = new String[columns];
int index = 0;
while (rs.next()){
Object[] entry = new Object[columns];
for (int i = 0; i < columns; i++) {
if(index == 0) {
header[i] = md.getColumnName(i+1);
}
entry[i] = rs.getObject(i+1);
}
if(index == 0) {
result.add(header);
}
result.add(entry);
index++;
}
...只是形式:完成try / catch / finally子句并关闭stmt,connection,rs in finnaly