left join on 多个条件

今天在写Android、iOS服务端的时候遇到一个问题(JAVA WEB)。

项目里面有帖子,对帖子可以进行“赞”,“踩”,“标记有用”的操作,数据库里有一张帖子表:card,还有一张操作记录表:record。当用户在做“赞”、“踩”、“标记有用”的操作时,会插入一条记录到record表中。

在读取帖子列表时需要读取出当前登录的用户是否操作过(“赞”、“踩”、“标记有用”)

起初的方案是先查询出帖子列表,然后在代码里面循环帖子列表,得到帖子ID,通过帖子ID分别去数据库查询 “赞”,“踩”,“标记有用”对应的记录,得到结果。
但是这么干的话会产生这么一种情况,一次请求需要查询很多条SQL语句。

比如,一个帖子的列表一页需要显示10个帖子信息。
那么它所执行的SQL语句就包括:
帖子列表查询(1条) + 循环帖子列表分别查询“赞”、“踩”、“标记有用”(3 * 10)
结果是31条,当一页的容量变大时,它的查询语句也会越来越多。
这么干实在太不科学了,于是想着将此块内容进行优化。是否可以以一条SQL语句将我所需要的信息全部查询出来?

试了好久,终于搞定,通过多个LEFT JOIN,并且ON多条件拼接,下面直接上代码:

SELECT sp.id, gr1.id AS gid1, gr2.id AS gid2, gr3.id AS gid3 FROM card AS sp

LEFT JOIN record AS gr1 ON sp.id = gr1.content_id 
	AND gr1.content_type = 'card' #这个记录表里包括 帖子和心情 两种类型的操作,通过这个字段去区分
	AND gr1.operat_type = 'good'  #对应的操作,“赞”、“踩”、“标记有用”
	AND gr1.member_id = 26        #当前登录会员的ID
	AND gr1.status = 'enabled'    #当前记录的状态 enabled为可用状态

LEFT JOIN record AS gr2 ON sp.id = gr2.content_id 
	AND gr2.content_type = 'card' 
	AND gr2.operat_type = 'step' 
	AND gr2.member_id = 26 
	AND gr2.status = 'enabled' 

LEFT JOIN record AS gr3 ON sp.id = gr3.content_id 
	AND gr3.content_type = 'card' 
	AND gr3.operat_type = 'mark' 
	AND gr3.member_id = 26 
	AND gr3.status = 'enabled'

WHERE 1 = 1 ORDER BY sp.card_addtime DESC limit 0,10	

猜你喜欢

转载自geningaixin.iteye.com/blog/2037111