这个查询语句查询出来的数据会显示多条重复的,但是实际表中数据又只有一条,是啥问题?该怎么改?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这个查询语句查询出来的数据会显示多条重复的,但是实际表中数据又只有一条,是啥问题?该怎么改?相关的知识,希望对你有一定的参考价值。
你又不是只查一张表, 你是多表关联了。实际表中数据又只有一条,是你某一张表这样吧,
关联后,这一条数据可能跟别的表都能关联上,所以就会变成多条了。
如果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 参考技术A 你又不是只查一张表, 你是多表关联了。
实际表中数据又只有一条,是你某一张表这样吧,
关联后,这一条数据可能跟别的表都能关联上,所以就会变成多条了。
如果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操作。子查询虽然很灵活,但是执行效率并不高。
那么问题来了,什么是子查询?为什么它的效率不高?
子查询:把内层查询结果当作外层查询的比较条件 参考技术C 首先附上代码:
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改为 参考技术D select distinct追问
我加在select后面就报错啊,怎么解?
distinct distinc
mysql 联表查询主表一条数据从表多条数据查询显示重复从表条数数据问题
问题:
当联表查询数据时,主表只有一条数据,从表有多条数据,left join联表查询时会显示重复的主表数据。
原因:
left join 以左表为主,但是如果右表中含有多条满足条件的记录的时,系统不知道应该舍去哪条查询结果,于是就都显示了。(引用大佬的解释)
解决办法:
使用group by进行分组(我自己成功的)
例子:
解决后:
以上是关于这个查询语句查询出来的数据会显示多条重复的,但是实际表中数据又只有一条,是啥问题?该怎么改?的主要内容,如果未能解决你的问题,请参考以下文章