`
geningaixin
  • 浏览: 18725 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

left join on 多个条件

    博客分类:
  • SQL
sql 
阅读更多
今天在写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	
分享到:
评论

相关推荐

    join on 语句及扩展

    在SQL查询中,JOIN操作是用于合并两个或更多表中的数据的关键部分,它允许你在不同表之间建立联系,以便从多个源获取所需的信息。这里我们将深入探讨几种JOIN类型及其使用,以及ON和WHERE子句的区别。 1. INNER ...

    left join 过滤条件写在on后面和写在where 后面的区别

    在SQL查询语句中,连接(JOIN)是一种非常重要的操作,用于从两个或多个表中获取数据。其中,`LEFT JOIN`是一种常用的连接类型,它返回左表的所有记录以及右表中匹配的记录。如果不匹配,则结果中的右表部分为NULL值...

    SQL语句left join/right join/inner join 的用法比较

    在SQL查询中,JOIN操作是连接两个或多个表的关键部分,用于从这些表中提取相关数据。本篇文章将深入探讨LEFT JOIN、RIGHT JOIN以及INNER JOIN的用法,并通过实例进行对比,帮助理解它们之间的差异。 1. LEFT JOIN...

    inner join、 left join 、right join、 outer join之间的区别

    在数据库操作中,连接(Join)是一种非常重要的操作,用于组合两个或多个表中的数据。根据连接的方式不同,可以分为几种类型:`INNER JOIN`、`LEFT JOIN`、`RIGHT JOIN`以及`FULL OUTER JOIN`。下面将详细解释这些...

    Left join优化规则的研究

    当存在多个 Left Join 时,优化策略同样适用。例如: ```sql SELECT * FROM t1 LEFT JOIN t2 ON t1.c1 = t2.d1 LEFT JOIN t3 ON t2.d2 = t3.e1 WHERE t3.e1 = 1; ``` 这个查询可以逐步优化: - 首先,`t3.e1 = 1`...

    from 多张表 等于 left join 其他表.

    标题与描述中的“from多张表等于left join其他表”主要涉及的是SQL查询语句中两种不同的连接方式:内连接(通常在FROM子句后直接使用WHERE子句实现)和左连接(LEFT JOIN)。这两种连接方式在处理多表查询时有着不同...

    hive sql + left join 数据缺失

    这是因为TEZ引擎在转换多个MapJoin为单个操作时,可能会限制输入数据的最大大小,从而导致数据的丢失。 #### 四、解决方案 针对上述问题,可以通过以下几种方式进行解决: 1. **调整bucketing_version**: - 通过...

    SQL left join

    SQLLeft Join是一种常用的数据库查询操作,它可以将两个或多个表格中的数据结合起来,以便更好地分析和处理数据。在本文中,我们将详细介绍SQL Left Join的使用方法、特点和区别,以及与Right Join和Inner Join的...

    sql中的left join及on、where条件关键字的区别详解

    如果我们仅使用`WHERE`子句而不进行JOIN,那么只会返回满足条件的单个表格的记录,无法合并来自多个表格的数据。 举例来说,如果我们有一个`class`表格和一个`score`表格,包含学生的成绩信息,可能想找出所有班级...

    Linq to datable(Left join right join full join)实例

    这些连接操作在数据处理和分析中扮演着重要角色,特别是在合并来自多个数据源的数据时。 描述 "LINQ to datable实现Left join right join full join VB2010源码" 提示我们这个实例是用Visual Basic 2010编写的,它...

    SQL中的left outer join,inner join,right outer join用法详解

    SELECT * FROM t_institution i LEFT OUTER JOIN t_teller t ON i.inst_no = t.inst_no WHERE i.inst_no = "5801" 右外连接(Right Outer Join) 右外连接是将右边表的全部行与左边表中的匹配行连接起来,例如: ...

    mysql多个left join连接查询用法分析

    MySQL中的LEFT JOIN是一种关联多个表的方法,用于返回左表的所有记录以及右表匹配的记录。在某些场景下,我们可能需要连接多个表来获取全面的数据信息。本篇文章将深入探讨MySQL多个LEFT JOIN连接查询的用法,通过...

    left join right join inner join 区别和联系

    在数据库管理系统中,连接(JOIN)是一种强大的工具,用于将多个表合并成一个结果集。左连接(LEFT JOIN)、右连接(RIGHT JOIN)和内连接(INNER JOIN)是三种最基本的连接类型。在本节中,我们将详细介绍左连接、...

    深入Oracle的left join中on和where的区别详解

    在Oracle数据库中,LEFT JOIN是一种联接操作,用于合并两个或更多表的记录,返回所有左表(第一个提及的表)的记录,即使在右表中没有匹配的记录。LEFT JOIN的关键在于它会保留左表的所有行,并尝试与右表匹配。当...

    关于sql的left join,right join,inner join,outerjoin

    在SQL查询中,JOIN操作是连接不同表的关键技术,它允许我们从多个相关的表中获取数据。本篇文章将深入探讨四种基本的JOIN类型:LEFT JOIN(左连接)、RIGHT JOIN(右连接)、INNER JOIN(内连接)以及OUTER JOIN(外...

    (Left join , Right Join, Inner Join)用法详解

    在数据库查询语言SQL中,连接(Join)是一种非常重要的操作,它允许我们结合两个或多个表的数据来检索信息。根据不同的连接方式,我们可以获取到不同范围的数据组合。本文将详细介绍三种常见的连接类型:Left Join、...

    Mysql之innerjoin,leftjoin,rightjoin详解.pdf

    Mysql 中的连接查询是指从多个表中检索数据,并将它们组合成一个结果集。inner join、left join 和 right join 是 Mysql 中三种最常用的连接查询方式。 inner join inner join 又称等值连接,是指从两个表中选择...

    解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题

    在这个Laravel的查询示例中,我们通过闭包函数传递给`leftJoin`方法,在闭包内部使用`on`方法来添加所有必要的连接条件。这样可以确保即使在筛选条件下,左表的记录也会被返回,而右表中不符合条件的记录则会显示为...

    MySQL left join操作中on和where放置条件的区别介绍

    在SQL查询中,`LEFT JOIN` 是一种连接两个或多个表的方法,以便从左表(通常是主表)中返回所有行,即使在右表中没有匹配的行。在这个过程中,`ON` 和 `WHERE` 子句都是用来指定条件的,但它们在查询逻辑中的作用...

    SQL _join on 和where的执行顺序1

    在SQL查询中,JOIN操作用于合并两个或多个表的数据,以便根据它们之间的关系获取更全面的信息。JOIN操作主要有四种类型:LEFT JOIN、RIGHT JOIN、INNER JOIN和FULL JOIN,每种都有其特定的用途。 1. LEFT JOIN(左...

Global site tag (gtag.js) - Google Analytics