2014-03-03 36 views
0

我有一個要求在每個主題內選擇前兩名的學生。這裏是我的表格和我正在使用的查詢來獲取它。在Spring Jdbc模板的查詢中使用mysql變量給出了錯誤

CREATE TABLE `students` (    
`student` varchar(10) DEFAULT NULL, 
`subject` varchar(10) DEFAULT NULL, 
`marks` int(10) DEFAULT NULL   
); 

INSERT INTO students VALUES 
('Deepak', 'Maths', 100), 
('Neha', 'Maths', 90), 
('Jyoti', 'Maths', 80), 
('Ashwini', 'Maths', 70), 
('Amit', 'Maths', 30), 
('Sandeep', 'Maths', 95), 
('Cinni', 'Maths', 86), 
('Anand', 'Maths', 75), 
('Deepak', 'Science', 100), 
('Neha', 'Science', 90), 
('Jyoti', 'Science', 80), 
('Ashwini', 'Science', 70), 
('Amit', 'Science', 30), 
('Sandeep', 'Science', 95), 
('Cinni', 'Science', 86), 
('Anand', 'Science', 75), 
('Deepak', 'History', 100), 
('Neha', 'History', 90), 
('Jyoti', 'History', 80), 
('Ashwini', 'History', 70), 
('Amit', 'History', 30), 
('Sandeep', 'History', 95), 
('Cinni', 'History', 86), 
('Anand', 'History', 75); 



mysql> SELECT * FROM students 
+---------+---------+-------+ 
| student | subject | marks | 
+---------+---------+-------+ 
| Deepak | Maths | 100 | 
| Neha | Maths | 90 | 
| Jyoti | Maths | 80 | 
| Ashwini | Maths | 70 | 
| Amit | Maths | 30 | 
| Sandeep | Maths | 95 | 
| Cinni | Maths | 86 | 
| Anand | Maths | 75 | 
| Deepak | Science | 100 | 
| Neha | Science | 90 | 
| Jyoti | Science | 80 | 
| Ashwini | Science | 70 | 
| Amit | Science | 30 | 
| Sandeep | Science | 95 | 
| Cinni | Science | 86 | 
| Anand | Science | 75 | 
| Deepak | History | 100 | 
| Neha | History | 90 | 
| Jyoti | History | 80 | 
| Ashwini | History | 70 | 
| Amit | History | 30 | 
| Sandeep | History | 95 | 
| Cinni | History | 86 | 
| Anand | History | 75 | 
+---------+---------+-------+ 
24 rows in set (0.00 sec) 

mysql> Set character_set_connection=latin1; 
Query OK, 0 rows affected (0.00 sec) 

mysql> Set character_set_results=latin1; 
Query OK, 0 rows affected (0.00 sec) 

mysql> Set character_set_client=latin1; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SET @rowcnt := 0; SET @grp := ''; SELECT d.* FROM (
    ->  SELECT 
    ->   cs.*, 
    ->   @rowcnt := IF(@grp != cs.subject, 1, @rowcnt + 1) AS rowcnt, 
    ->   @grp := cs.subject 
    ->  FROM (
    ->   SELECT * FROM students ORDER BY subject, marks DESC 
    -> ) cs 
    ->) d 
    -> WHERE d.rowcnt < 3; 
Query OK, 0 rows affected (0.00 sec) 
Query OK, 0 rows affected (0.00 sec) 

+---------+---------+-------+--------+--------------------+ 
| student | subject | marks | rowcnt | @grp := cs.subject | 
+---------+---------+-------+--------+--------------------+ 
| Deepak | History | 100 |  1 | History   | 
| Sandeep | History | 95 |  2 | History   | 
| Deepak | Maths | 100 |  1 | Maths    | 
| Sandeep | Maths | 95 |  2 | Maths    | 
| Deepak | Science | 100 |  1 | Science   | 
| Sandeep | Science | 95 |  2 | Science   | 
+---------+---------+-------+--------+--------------------+ 
6 rows in set (0.00 sec) 

mysql> 

現在,一切工作正常,從控制檯,但是當我在Spring的JdbcTemplate執行相同的查詢,它給我的錯誤。

jdbcTemplate.query(query, new StudentRowMapper()); 

查詢打印出以下這是因爲我使用的命令行該查詢完全相同。

SET @rowcnt := 0; SET @grp := ''; SELECT d.* FROM (SELECT cs.*, @rowcnt := IF(@grp != cs.subject, 1, @rowcnt + 1) AS rowcnt, @grp := cs.subject FROM (SELECT * FROM students ORDER BY subject, marks DESC) cs) d WHERE d.rowcnt < 3; 

這是我得到的運行時,該錯誤:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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 'SET @grp := ''; SELECT d.* FROM (SELECT cs.*, ' at line 1 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Unknown Source) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
at com.mysql.jdbc.Util.getInstance(Util.java:386) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4190) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4122) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2818) 
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2157) 
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2324) 
at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:646) 
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:589) 
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:639) 
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:668) 
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:676) 
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:716) 

回答

0

剛剛發生的增值經銷商在選擇這樣

SELECT d.* 
FROM 
    (SELECT cs.*, @rowcnt := IF(@grp != cs.subject, 1, @rowcnt + 1) AS rowcnt, @grp := cs.subject 
    FROM (SELECT * FROM (select @rowcnt :=0, @grp :='') a,students ORDER BY subject, marks DESC) cs) d 
WHERE d.rowcnt < 3; 
+1

這並不」表明任何錯誤,也沒有數據被返回。 – divinedragon