SQL嵌套查询语句的报错问题

问题描述

SQL嵌套查询语句的报错问题 5C
String sql = ""select * from msgInfo where ID in(select top 15 ID from msgInfo where chatRoom=? Order by chatTime DESC) order by chatTime"";
String userName=session.getAttribute(""_USER"").toString();
PreparedStatement ps = conn.preparedStatement(sql);
ps.setString(1session.getAttribute(""_CHAT_ROOM"").toString());
ResultSet rs = conn.executeQuery();

这语句有问题吗,怎么老报错,没道理啊

ou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '15 ID from msgInfo where chatRoom='dragon inn' Order by chatTime DESC) order by ' at line 1
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 '15 ID from msgInfo where chatRoom='dragon inn' Order by chatTime DESC) order by ' at line 1

解决方案

一Mysql 应该是不支持top关键词的你应该用limit
二.limit 关键词不能和 in 一起使用所以你要在limit子查询外再嵌套一层子查询.

解决方案二:
一楼正解,mysql去前几行的是limit 0,3,,是0行到第3行的数据

解决方案三:
SELECT *
FROM msgInfo
WHERE ID IN (
SELECT id
FROM (
SELECT ID
FROM msgInfo
WHERE chatRoom = ?
ORDER BY chatTime DESC
limit 15
)
) AS tmp
ORDER BY chatTime

解决方案四:
一楼一楼,他的可以的

解决方案五:

SELECT *FROM msgInfoWHERE ID IN (        SELECT id        FROM (            SELECT ID            FROM msgInfo            WHERE chatRoom = ?            ORDER BY chatTime DESC             limit 15            )        ) AS tmpORDER BY chatTime

解决方案六:
我试到了正确的答案SELECT * FROM msginfo WHERE ID IN(SELECT ID FROM msginfo WHERE chatRoom='dragon inn' ORDER BY chattime DESC ) ORDER BY chattime LIMIT 15; 谢谢你们这么热心帮我

解决方案七:
我试到了正确的答案SELECT * FROM msginfo WHERE ID IN(SELECT ID FROM msginfo WHERE chatRoom='dragon inn' ORDER BY chattime DESC ) ORDER BY chattime LIMIT 15; 谢谢你们这么热心帮我

解决方案八:
SELECT * FROM msgInfo t
WHERE EXISTS (
SELECT ID
FROM (
SELECT ID FROM msgInfo WHERE chatRoom = ? ORDER BY chatTime DESC limit 15)
) TMP
WHERE TMP.ID=T.ID
ORDER BY T.chatTime;
可以这样写,用exists代替in,因为mysql 会自动将in 解析为exists,所以,从优化的角度用exists比in更合适
关于嵌套查询如何优化,有兴趣可以看看 http://www.data.5helpyou.com/article272.html

解决方案九:
还是我太年轻了。。。我的是错的,吗,没有输出出最新的记录,还是他的对的,就是把AD tmp放前面去一点就好了,尴尬了

时间: 2016-10-19

SQL嵌套查询语句的报错问题的相关文章

oracle sql语句疑问,关于嵌套查询语句的执行先后顺序

问题描述 oracle sql语句疑问,关于嵌套查询语句的执行先后顺序 1.select A.END from 2. tableA A,tableB B 3.where A.X=B.Y 4.and A.END = ( 5. select MAX(END) from tableA 6. where tableA.X = B.Y 7. ): 我想问一下.按理max只有一个最值,为何这样写会出来多个.另外第5,6,7行是子查询,不是很理解为什么可以里面调用父查询里面的B.能详细说一下这个sql 完整的

sql语句解析-使用lex和yacc解析SQL语句,报错segmentation fault问题

问题描述 使用lex和yacc解析SQL语句,报错segmentation fault问题 我这有一个linux下c.c++多线程程序,使用lex和yacc解析SQL,程序执行较快时总是报错segmentation fault,执行非常慢时,可以解析好多sql语句,但是偶尔也会报segmentation fault错误. 跟踪是发现有个yyparse中的yyvas指针(YYSTYPE结构体)strval中有好多out of bound信息,不知道与这个有关系没有.有人遇到过这个类似问题吗?

java-xml写sql语句,还报错啊

问题描述 xml写sql语句,还报错啊 这个怎么回事啊,求大神讲解 解决方案 不能使用 < 改成 CDATA 如 <![CDATA[<=]] 解决方案二: 你的xml里有特殊字符,需要CDATA来防止转义 解决方案三: xml的特殊字符需要放到<![CDATA[ ]]>里面,不然不会被识别 解决方案四: 为什么放进去,读不出数据来啊? 解决方案五: and cc.task_createtime >= #{createtimeStart} 这种形式可以查出数据来,但是用了

关于sql server查询语句的写法。

问题描述 关于sql server查询语句的写法. 怎样写一个查询语句select distinct ID from TrainTime order by ID select Station from TrainTime where S_No='1'order by ID select Stationfrom TrainTime where D_Time='-' order by ID 怎样把这3个查询语句写为一句啊,让查询查来的结果为这3列数据. 因为我想建一个表,为3列,列名为:列车车次.起

c++-ado与数据库连接时成功了,但用参数化查询时却报错unkown error 0x800A0E7D

问题描述 ado与数据库连接时成功了,但用参数化查询时却报错unkown error 0x800A0E7D 数据库用的是server 2005,但在下载时遇到了问题,,后来求助网上,完成后,程序名却叫microsoft sql server studio express,不晓得是不是数据库的问题. 希望大神指点! 以下是我的代码:我在CADOcon定义了_connectionptr指针,所以connection这一部分应该是没问题的.void AddUser::OnOK() { // TODO:

sql-【SQL求助】用SQL Server查询语句中,IN 的使用问题。

问题描述 [SQL求助]用SQL Server查询语句中,IN 的使用问题. 我想查询一辆车在一个月内的记录.于是编写了如下代码: select * from 北京车辆能耗数据.dbo.北京朝批商贸股份有限公司 where ( [列 0] in ('京AC3537') and CAST ([列 2] as datetime)>'2013/11/1 00:00:00' and CAST ([列 2] as datetime)<'2013/12/1 00:00:00' ) order by CAS

java-一个纠结的sql分组查询语句

问题描述 一个纠结的sql分组查询语句 是这样的 数据库里有一张 宿舍用电表(宿舍号,时间,电表度数) dormitoryElectric(dormitory,time,electric) 里面存的是每个小时电表上的度数,那我想查询所有宿舍近7天的每天用电度数要怎么写. 效果大概是这样的: 宿舍1 第一天用电度数 第二天用电度数 第三天用电度数 ... 宿舍2 第一天用电度数 第二天用电度数 第三天用电度数 ... 第二天用电度数应该是第二天的最后一次电表度数减去第一天的最后一次电表度数 解决方

android-新手求助:安卓sql查找的函数,报错Nullpointerexception

问题描述 新手求助:安卓sql查找的函数,报错Nullpointerexception 代码如下 public User search(String username){ SQLiteDatabase sdb = helper.getReadableDatabase(); Cursor cursor =sdb.rawQuery("select * from user where username=?", new String[]{username}); if(cursor.moveTo

oracle查询语句老是报ORA-00907缺失右括号

问题描述 oracle查询语句老是报ORA-00907缺失右括号 --大家好,我有一条oracle查询语句老是报ORA-00907缺失右括号的错误,能不能帮我看一下,谢谢: --统计毕业班等级考试最佳成绩 select distinct e.xy 学院, e.xzb 班级, e.xh 学号, e.xm 姓名, a.cet3 英语三级, b.cet4 英语四级, c.cet6 英语六级, d.computer 计算机 from ((select xh, xm, djksmc, max(cj) ce