今天在写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
分享到:
相关推荐
在SQL查询中,JOIN操作是用于合并两个或更多表中的数据的关键部分,它允许你在不同表之间建立联系,以便从多个源获取所需的信息。这里我们将深入探讨几种JOIN类型及其使用,以及ON和WHERE子句的区别。 1. INNER ...
在SQL查询语句中,连接(JOIN)是一种非常重要的操作,用于从两个或多个表中获取数据。其中,`LEFT JOIN`是一种常用的连接类型,它返回左表的所有记录以及右表中匹配的记录。如果不匹配,则结果中的右表部分为NULL值...
在SQL查询中,JOIN操作是连接两个或多个表的关键部分,用于从这些表中提取相关数据。本篇文章将深入探讨LEFT JOIN、RIGHT JOIN以及INNER JOIN的用法,并通过实例进行对比,帮助理解它们之间的差异。 1. LEFT JOIN...
在数据库操作中,连接(Join)是一种非常重要的操作,用于组合两个或多个表中的数据。根据连接的方式不同,可以分为几种类型:`INNER JOIN`、`LEFT JOIN`、`RIGHT JOIN`以及`FULL OUTER 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其他表”主要涉及的是SQL查询语句中两种不同的连接方式:内连接(通常在FROM子句后直接使用WHERE子句实现)和左连接(LEFT JOIN)。这两种连接方式在处理多表查询时有着不同...
这是因为TEZ引擎在转换多个MapJoin为单个操作时,可能会限制输入数据的最大大小,从而导致数据的丢失。 #### 四、解决方案 针对上述问题,可以通过以下几种方式进行解决: 1. **调整bucketing_version**: - 通过...
SQLLeft Join是一种常用的数据库查询操作,它可以将两个或多个表格中的数据结合起来,以便更好地分析和处理数据。在本文中,我们将详细介绍SQL Left Join的使用方法、特点和区别,以及与Right Join和Inner Join的...
如果我们仅使用`WHERE`子句而不进行JOIN,那么只会返回满足条件的单个表格的记录,无法合并来自多个表格的数据。 举例来说,如果我们有一个`class`表格和一个`score`表格,包含学生的成绩信息,可能想找出所有班级...
这些连接操作在数据处理和分析中扮演着重要角色,特别是在合并来自多个数据源的数据时。 描述 "LINQ to datable实现Left join right join full join VB2010源码" 提示我们这个实例是用Visual Basic 2010编写的,它...
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连接查询的用法,通过...
在数据库管理系统中,连接(JOIN)是一种强大的工具,用于将多个表合并成一个结果集。左连接(LEFT JOIN)、右连接(RIGHT JOIN)和内连接(INNER JOIN)是三种最基本的连接类型。在本节中,我们将详细介绍左连接、...
在Oracle数据库中,LEFT JOIN是一种联接操作,用于合并两个或更多表的记录,返回所有左表(第一个提及的表)的记录,即使在右表中没有匹配的记录。LEFT JOIN的关键在于它会保留左表的所有行,并尝试与右表匹配。当...
在SQL查询中,JOIN操作是连接不同表的关键技术,它允许我们从多个相关的表中获取数据。本篇文章将深入探讨四种基本的JOIN类型:LEFT JOIN(左连接)、RIGHT JOIN(右连接)、INNER JOIN(内连接)以及OUTER JOIN(外...
在数据库查询语言SQL中,连接(Join)是一种非常重要的操作,它允许我们结合两个或多个表的数据来检索信息。根据不同的连接方式,我们可以获取到不同范围的数据组合。本文将详细介绍三种常见的连接类型:Left Join、...
Mysql 中的连接查询是指从多个表中检索数据,并将它们组合成一个结果集。inner join、left join 和 right join 是 Mysql 中三种最常用的连接查询方式。 inner join inner join 又称等值连接,是指从两个表中选择...
在这个Laravel的查询示例中,我们通过闭包函数传递给`leftJoin`方法,在闭包内部使用`on`方法来添加所有必要的连接条件。这样可以确保即使在筛选条件下,左表的记录也会被返回,而右表中不符合条件的记录则会显示为...
在SQL查询中,`LEFT JOIN` 是一种连接两个或多个表的方法,以便从左表(通常是主表)中返回所有行,即使在右表中没有匹配的行。在这个过程中,`ON` 和 `WHERE` 子句都是用来指定条件的,但它们在查询逻辑中的作用...
在SQL查询中,JOIN操作用于合并两个或多个表的数据,以便根据它们之间的关系获取更全面的信息。JOIN操作主要有四种类型:LEFT JOIN、RIGHT JOIN、INNER JOIN和FULL JOIN,每种都有其特定的用途。 1. LEFT JOIN(左...