首页 > 编程问答 >多重查询 5 个只有 1 个 ID 的表,连接查询从 5 个表中获取结果

多重查询 5 个只有 1 个 ID 的表,连接查询从 5 个表中获取结果

时间:2024-05-29 23:52:08浏览次数:48  
标签:sql mysql join

关于我的表格,我正在为我喜欢玩的一款游戏创建一个脚本,如果人们的账户分配了 XYZ 语句,我就会创建一个脚本。它基于 4 个表。1 个表保存了带有比赛 ID 的过往比赛,下一个表保存了比赛 ID 与玩家 ID 的关系,表 3 保存了玩家 ID 与游戏内 ID 的关系,而最后一个表保存了有关分配给他们的声明的信息。

一场比赛中可能有多达 15 名球员,因此需要关系表,有些球员在不同的比赛中出现不止一次。

因此这些关系表如下所示:games(比赛 ID)-> match to player(比赛 ID 到球员 ID)-> players(球员 ID 到游戏内 ID)-> player Info(游戏内 ID ->查询所需的信息)

 

因此,当脚本被查询时,我将比赛所有者 UID 与比赛数据一起保存在包含比赛信息的第一个表中,它将根据所有者 ID 返回所有比赛 ID,因此,所有比赛 ID 将检查下一个表,以获得所有唯一的玩家 ID,根据该列表,然后查询下一个表,以获得所有这些游戏内 ID 的列表,根据该列表,然后查询最后一个表,以获得每个玩家的游戏内分配。

我无法改变表格的方式,因为所有其他脚本都依赖于这些表格。

我已经尝试了一些连接语句,但没有一个语句能达到我的要求,甚至没有一个语句能达到我要求的一半,但我确实认为连接语句的使用将使我达到我所需要的目标。

schema

我正试图根据第一个表中的 ID 从图片上的最后一个表中获取一个列表。我知道我需要使用连接,但是我不确定连接的顺序,我需要一些指导来说明如何组织连接以获得我需要的数据。

SELECT b.*
FROM banInfo AS b
JOIN players AS p ON b.game_id=p.game_id
JOIN player2match AS pm ON pm.pid=p.id
JOIN matches AS m ON m.id=pm.mid
JOIN users AS u ON u.id=m.uid
WHERE u.id = 1 AND b.comBan = 1 OR b.playerBan > 0 OR b.nGameBan > 0

这是我目前使用的查询,它是半工作的,因为它确实返回了所需信息的列表,但比应该返回的要多得多,所以不知何故它选择了一些不应该选择的信息,问题是我不知道它总共应该返回多少信息,这是我需要查询的内容之一,以便获得信息的总数。但我知道它返回的数据太多了,因为数据库中总共有 1355 名被禁赛的球员,但该查询却返回了 2254 行,所以不知为何选择的数据比它应该选择的要多。

谢谢!


你的查询返回过多的行的原因可能是因为你使用了 OR 来组合了 WHERE 子句中的条件。 尝试使用 IN 操作符和一个子查询来代替多个连接,这将使你的查询更有效率,并确保你只检索与所有者 ID 为 1 的比赛相关的玩家信息。

试试这个查询:

SELECT DISTINCT b.*
FROM banInfo AS b
WHERE b.game_id IN (
    SELECT p.game_id
    FROM players AS p
    JOIN player2match AS pm ON pm.pid = p.id
    JOIN matches AS m ON m.id = pm.mid
    WHERE m.uid = 1
)
AND (b.comBan = 1 OR b.playerBan > 0 OR b.nGameBan > 0);

这个查询的工作原理如下:

  1. 子查询:
  2. 它首先从 matches 表中选择 uid 为 1 的所有比赛。
  3. 然后使用 player2match 表将这些比赛与相应的玩家 ID 连接起来。
  4. 最后,它使用 players 表检索与这些玩家 ID 相关的 game_id

  5. 主查询:

  6. 它从 banInfo 表中选择记录,其中 game_id 存在于子查询返回的 game_id 列表中。
  7. 它还使用 WHERE 子句来过滤结果,只包括满足以下任一条件的记录:comBan = 1playerBan > 0nGameBan > 0
  8. DISTINCT 关键字用于确保结果集中只返回唯一的记录,从而防止由于多个表中的关系而可能出现的任何重复。

通过使用这种方法,你避免了多个连接,并简化了查询逻辑,使其更容易理解和维护。 这也应该会提高查询的性能,特别是对于大型数据集。

标签:sql,mysql,join
From: 78546892

相关文章

  • 记一次“有手就行”的从SQL注入到文件上传Getshell的简单过程
    0x01前台SQL注入漏洞原理SQL注入漏洞的原理是应用程序没有对用户输入进行充分的验证和过滤,导致攻击者可以在输入框中插入恶意的SQL代码。当应用程序将用户输入的数据拼接到SQL查询语句中时,攻击者插入的恶意代码也会被执行,从而绕过身份验证和访问控制,直接访问或修改数据库......
  • Linux下使用mysql
    安装源码安装和yum安装。可以看教程:菜鸟教程:mysql安装使用日常操作命令启停服务1.查看进程状态ps-ef|grepmysql2.mysql服务启停sudosystemctlstartmysql#启动sudosystemctlstopmysql#关闭sudosystemctlrestartmysql#重启sudosystemctlstatusmysql......
  • 如何理解mysql小表驱动大表
    就像自行车爬坡一样么,小齿轮驱动大齿轮MySQL采用“小表驱动大表”的策略,确实在某种程度上类似于自行车爬坡时小齿轮驱动大齿轮的原理,目的都是为了更高效地利用有限的资源达到目标。在数据库查询的上下文中,这个策略背后的逻辑可以这样理解:1.**效率最大化**:小表数据量少,遍历小......
  • 成为MySQL DBA后,再看ORACLE数据库(六、逻辑存储结构)
    数据库的逻辑存储结构也可以叫做存储层次体系,ORACLE的存储层次体系按照层次从高到低分为:表空间(tablespace)、段(segment)、区(extent)、块(block)。熟悉数据库的逻辑存储结构可以帮助我们分析与定位数据库的空间容量问题。一、段段是表空间的主要组织结构。段就是占用存储空间的数据库......
  • kettle从入门到精通 第六十四课 ETL之kettle kettle中执行SQL脚本步骤,使用需当心
    1、群里有不定时会有同学反馈执行SQL脚本步骤使用有问题,那么咱们今天一起来学习下该步骤。trans中的执行SQL脚本有两方面功能,使用时需小心,不然很容易踩坑。官方定义: 翻译:您可以使用此步骤执行SQL脚本,可以选择在转换的初始化阶段执行一次,或者针对步骤接收的每一行输入执行一......
  • MySQL——事务补充
    十一、RR和RC的本质区别select*from表名(lockinsharemode)#当不加共享锁时,说明此时进行的是快照读,加了共享锁则进行的是当前读;​当进行快照读的时候才会形成readview结构;​readview形成的时机不同,会影响事务的可见性,会造成RR和RC级别下事务可见性的不同;当RR......
  • 基于SSM+Jsp+Mysql的高校二手交易平台
    开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示前台首页用户注册用户登录个人中心商品信息管理员登录商品上架管理商品信息管理客服聊天管......
  • 【MySQL】MySQL Connect -- 详解
    一、Connector /C使用要使用 C 语言连接MySQL,需要使用MySQL 官网提供的库,可以去官网进行下载:MySQL::MySQLCommunityDownloads我们使用 C 接口库来进行连接,要正确使用,还需要做一些准备工作:保证 MySQL 服务有效。在官网上下载合适自己平台的 MySQLConnec......
  • 记一次基于倒序索引的SQL优化
    本文测试环境为SQLserver2019背景某业务流水表,会基于固定范围内的业务编号做写入以及查询操作,热数据的量级在亿级别,一个典型的查询是基于业务编码查询最新(时间戳)某种状态的前N条数据简化后的表结构如下createtableTestTable01(idbigintidentit......
  • 揭秘PostgreSQL:如何查询表字段名称
    哈喽,大家好,我是木头左!PostgreSQL简介PostgreSQL是一个功能强大、开源的对象-关系型数据库管理系统(ORDBMS),它提供了许多高级功能,如事务支持、多版本并发控制(MVCC)、全文搜索等。PostgreSQL广泛应用于各种场景,如Web应用开发、企业级应用、数据仓库等。因此,掌握PostgreSQL的基本操......