这个查询语句查询出来的数据会显示多条重复的,但是实际表中数据又只有一条,是什么问题?该怎么改?
7个回答
展开全部
你又不是只查一张表, 你是多表关联了。
实际表中数据又只有一条,是你某一张表这样吧,
关联后,这一条数据可能跟别的表都能关联上,所以就会变成多条了。
如果select 出来的项全相同,你可以distinct
追问 : 对,就是像你说的一条数据跟别的表都能关联上,但是该怎么解决呢? distinct我加在select后面,ID前面又报错,该怎么解决?
追答 : distinct不能用就按下面的,select 后面多少项 group by 后面就写多少as 前面的 select a as A, b as B, c as C from ... left joing ... where.. group by a,b,c
实际表中数据又只有一条,是你某一张表这样吧,
关联后,这一条数据可能跟别的表都能关联上,所以就会变成多条了。
如果select 出来的项全相同,你可以distinct
追问 : 对,就是像你说的一条数据跟别的表都能关联上,但是该怎么解决呢? distinct我加在select后面,ID前面又报错,该怎么解决?
追答 : distinct不能用就按下面的,select 后面多少项 group by 后面就写多少as 前面的 select a as A, b as B, c as C from ... left joing ... where.. group by a,b,c
展开全部
你又不是只查一张表, 你是多表关联了。
实际表中数据又只有一条,是你某一张表这样吧,
关联后,这一条数据可能跟别的表都能关联上,所以就会变成多条了。
如果select 出来的项全相同,你可以distinct
实际表中数据又只有一条,是你某一张表这样吧,
关联后,这一条数据可能跟别的表都能关联上,所以就会变成多条了。
如果select 出来的项全相同,你可以distinct
追问
对,就是像你说的一条数据跟别的表都能关联上,但是该怎么解决呢?
distinct我加在select后面,ID前面又报错,该怎么解决?
追答
distinct不能用就按下面的,select 后面多少项 group by 后面就写多少as 前面的
select a as A, b as B, c as C
from ...
left joing ...
where..
group by a,b,c
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
子查询就是查询中又嵌套的查询,表连接都可以用子查询,但不是所有子查询都能用表连接替换,子查询比较灵活,方便,形式多样,适合用于作为查询的筛选条件,而表连接更适合与查看多表的数据。
子查询不一定需要两个表有关联字段,而连接查询必须有字段关联(所谓的主外键关系)
表关联的效率要高于子查询,因为子查询走的是笛卡尔积
表关联可能有多条记录,子查询只有一条记录,如果需要唯一的列,最好走子查询
对于数据量多的肯定是用连接查询快些,原因:因为子查询会多次遍历所有的数据(视你的子查询的层次而定),而连接查询只会遍历一次。
但是数据量少的话也就无所谓是连接查询还是子查询,视自己的习惯而定。一般情况下还是用子查询来的好,容易控制
为什么子查询比连接查询(LEFT JOIN)效率低
MySQL从4.1版本开始支持子查询,使用子查询进行SELECT语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的SQL操作。子查询虽然很灵活,但是执行效率并不高。
那么问题来了,什么是子查询?为什么它的效率不高?
子查询:把内层查询结果当作外层查询的比较条件
子查询不一定需要两个表有关联字段,而连接查询必须有字段关联(所谓的主外键关系)
表关联的效率要高于子查询,因为子查询走的是笛卡尔积
表关联可能有多条记录,子查询只有一条记录,如果需要唯一的列,最好走子查询
对于数据量多的肯定是用连接查询快些,原因:因为子查询会多次遍历所有的数据(视你的子查询的层次而定),而连接查询只会遍历一次。
但是数据量少的话也就无所谓是连接查询还是子查询,视自己的习惯而定。一般情况下还是用子查询来的好,容易控制
为什么子查询比连接查询(LEFT JOIN)效率低
MySQL从4.1版本开始支持子查询,使用子查询进行SELECT语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的SQL操作。子查询虽然很灵活,但是执行效率并不高。
那么问题来了,什么是子查询?为什么它的效率不高?
子查询:把内层查询结果当作外层查询的比较条件
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先附上代码:
public List<YbReview> findSome(Integer articleid)throws Exception{
List<YbReview> list=new ArrayList<YbReview>();
Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
YbReview ybReview=null;
YbUser ybUser=null;
try{
con=DBUtil.getDb();
String sql="select a.user_name,b.* from yb_user a,yb_review b where a.user_id=b.user_id and b.article_id=? order by review_datetime desc";
pstmt=con.prepareStatement(sql);
pstmt.setInt(1,articleid);
rs=pstmt.executeQuery();
if(rs.next()){
ybReview=new YbReview();
ybUser=new YbUser();
ybUser.setUsername(rs.getString("user_name"));
ybReview.setReviewid(rs.getInt("review_id"));
ybReview.setArticleid(rs.getInt("article_id"));
ybReview.setReviewContent(rs.getString("review_content"));
ybReview.setReviewdatetime(rs.getDate("review_datetime"));
ybUser.setUserid(rs.getInt("user_id"));
ybReview.setYbuser(ybUser);
list.add(ybReview);
}
}finally{
DBUtil.CloseDataBase();
}
return list;
}
2 然后,我就很郁闷了,明明是多条记录,可是出来的JSP页面上总是只有一条记录,看了SQL语句也正确啊,找了很久才发现是
if(rs.next()){的问题,将if改为
public List<YbReview> findSome(Integer articleid)throws Exception{
List<YbReview> list=new ArrayList<YbReview>();
Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
YbReview ybReview=null;
YbUser ybUser=null;
try{
con=DBUtil.getDb();
String sql="select a.user_name,b.* from yb_user a,yb_review b where a.user_id=b.user_id and b.article_id=? order by review_datetime desc";
pstmt=con.prepareStatement(sql);
pstmt.setInt(1,articleid);
rs=pstmt.executeQuery();
if(rs.next()){
ybReview=new YbReview();
ybUser=new YbUser();
ybUser.setUsername(rs.getString("user_name"));
ybReview.setReviewid(rs.getInt("review_id"));
ybReview.setArticleid(rs.getInt("article_id"));
ybReview.setReviewContent(rs.getString("review_content"));
ybReview.setReviewdatetime(rs.getDate("review_datetime"));
ybUser.setUserid(rs.getInt("user_id"));
ybReview.setYbuser(ybUser);
list.add(ybReview);
}
}finally{
DBUtil.CloseDataBase();
}
return list;
}
2 然后,我就很郁闷了,明明是多条记录,可是出来的JSP页面上总是只有一条记录,看了SQL语句也正确啊,找了很久才发现是
if(rs.next()){的问题,将if改为
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2016-06-24
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询