为什么我的查询返回的结果很多?

2024-02-04

我有一群候选人,他们都做过一份或多份工作,每个人都有一家公司,使用一些技能。

糟糕的 ASCII 艺术如下:

         ---------------                              ---------------   
         | candidate 1 |                              | candidate 2 |
         --------------- \                             --------------      
           /              \                                 |
       -------              --------                        etc
       |job 1|              | job 2 |  
       -------              ---------  
        /     \              /      \  
  ---------   ---------  ---------   --------  
  |company |  | skills | |company | | skills |  
  ---------   ---------  ---------- ----------  

这是我的数据库:

mysql> describe jobs;
+--------------+---------+------+-----+---------+----------------+
| Field        | Type    | Null | Key | Default | Extra          |
+--------------+---------+------+-----+---------+----------------+
| job_id       | int(11) | NO   | PRI | NULL    | auto_increment |
| candidate_id | int(11) | NO   | MUL | NULL    |                |
| company_id   | int(11) | NO   | MUL | NULL    |                |
| start_date   | date    | NO   | MUL | NULL    |                |
| end_date     | date    | NO   | MUL | NULL    |                |
+--------------+---------+------+-----+---------+----------------+

.

mysql> describe candidates;
+----------------+----------+------+-----+---------+----------------+
| Field          | Type     | Null | Key | Default | Extra          |
+----------------+----------+------+-----+---------+----------------+
| candidate_id   | int(11)  | NO   | PRI | NULL    | auto_increment |
| candidate_name | char(50) | NO   | MUL | NULL    |                |
| home_city      | char(50) | NO   | MUL | NULL    |                |
+----------------+----------+------+-----+---------+----------------+

.

mysql> describe companies;
+-------------------+---------------+------+-----+---------+----------------+

| Field             | Type          | Null | Key | Default | Extra          |
+-------------------+---------------+------+-----+---------+----------------+
| company_id        | int(11)       | NO   | PRI | NULL    | auto_increment |
| company_name      | char(50)      | NO   | MUL | NULL    |                |
| company_city      | char(50)      | NO   | MUL | NULL    |                |
| company_post_code | char(50)      | NO   |     | NULL    |                |
| latitude          | decimal(11,8) | NO   |     | NULL    |                |
| longitude         | decimal(11,8) | NO   |     | NULL    |                |
+-------------------+---------------+------+-----+---------+----------------+

.

mysql> describe skills;
+----------+---------+------+-----+---------+-------+
| Field    | Type    | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| skill_id | int(11) | NO   | MUL | NULL    |       |
| job_id   | int(11) | NO   | MUL | NULL    |       |
+----------+---------+------+-----+---------+-------+

.

mysql> describe skill_names;
+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| skill_id   | int(11)  | NO   | PRI | NULL    | auto_increment |
| skill_name | char(32) | NO   | MUL | NULL    |                |
+------------+----------+------+-----+---------+----------------+

这是我的查询尝试(注意,我打算将通配符更改为字段名称;我只是想让某些东西起作用):

SELECT can.* , co.*, j.*, sn.*
FROM candidates AS can
JOIN jobs AS j 
JOIN companies AS co ON j.company_id = co.company_id
JOIN skills AS s ON s.job_id = j.job_id
JOIN skill_names AS sn ON s.skill_id = s.skill_id

海蒂SQL 说/* Affected rows: 0 Found rows: 34,461,651 Warnings: 0 Duration for 1 query: 0.000 sec. (+ 105.078 sec. network) */

查询出了什么问题?我希望从糟糕的 ASCII 艺术中可以清楚地看出我想要实现的目标。

(另外,我加入表的顺序是否有任何速度差异?我会担心新的 MySql v8 函数稍后将其作为嵌套 JSON 检索)


您缺少之间的连接条件candidates and jobs,这样您就可以得到两个表之间的笛卡尔积。另外,连接条件也有问题skill_names,其中两列相同(这再次生成笛卡尔积)。

SELECT can.* , co.*, j.*, sn.*
FROM candidates AS can
JOIN jobs AS j ON j.candidate_id = can.candidate_id --> here: missing join condition
JOIN companies AS co ON j.company_id = co.company_id
JOIN skills AS s ON s.job_id = j.job_id
JOIN skill_names AS sn ON sn.skill_id = s.skill_id  --> and here: wrong join condition

许多 RDBMS 会引发语法错误JOIN没有ON子句(如果您确实想要笛卡尔积,则需要通过使用来明确它CROSS JOIN),但是,可惜,不是 MySQL。


当说到这个问题的时候:

我加入表格的顺序对速度有影响吗?

不会。只要您使用inner joins (not left joins),连接顺序对于查询规划器来说并不重要,查询规划器会按照它认为更有效的顺序重新排列它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的查询返回的结果很多? 的相关文章

  • 如何在 MySQL 中测试 Select for Update

    我正在表演SELECT FOR UPDATE或 InnoDB 表的行级锁定 我的目的是只有一个请求可以读取同一行 因此 如果两个用户同时请求相同的数据 其中只有一个人获取数据 即第一个触发查询的人 但是我如何测试锁定是否已放置 因为我正在通
  • 如何通过子 POJO 的属性过滤复合 ManyToMany POJO?

    我有两个像这样的房间实体 Entity public class Teacher implements Serializable PrimaryKey autoGenerate true public int id ColumnInfo n
  • 数据库字段中的逗号分隔值

    我有一个产品表 该表中的每一行对应一个产品 并由唯一的 ID 标识 现在 每个产品都可以有多个与该产品关联的 代码 例如 Id Code 0001 IN ON ME OH 0002 ON VI AC ZO 0003 QA PS OO ME
  • st_intersects 与 st_overlaps

    这两个查询有什么区别 select a gid sum length b the geom from polygons as a roads as b where st intersects a the geom b the geom gr
  • 在 SQL 中,如何从 SELECT * FROM ... 中排除结果?

    我知道我的标题不太具有描述性 让我在这里详细解释一下 假设一个表有 26 个字段 例如字段 a 字段 z 我只想要一个选择查询只返回 15 个字段 所以 通常 我会执行 SELECT field a field b field o FROM
  • Mysql用in语句限制

    我正在写一个查询 SELECT user bookmarks id as user bookmark id bookmark id user bookmarks user id bookmark url bookmark website b
  • 使用子查询 select 创建新表

    我试图从子查询选择创建一个新表 但出现以下错误 附近的语法不正确 SELECT INTO foo FROM SELECT DATEPART MONTH a InvoiceDate as CalMonth DATEPART YEAR a In
  • 如何从 SQL Server 2008 查询结果中删除“NULL”

    我有一个包含 59 列和超过 17K 行的表 很多行都有NULL在某些列中 我想删除NULL以便查询返回空白 而不是NULL 我可以运行一些更新功能来替换所有NULL with 使用 SQL Server 2008R2 Management
  • 如何识别拼写不同的相似单词

    我想从数据库中过滤掉重复的客户名称 一位客户可能有多个同名但拼写差异不大的系统条目 这是一个示例 名为 Brook 的客户可能有 3 个系统条目 有了这个变化 布鲁克 贝尔塔 布鲁克 贝尔塔 比鲁克 贝尔塔 假设我们将此名称放入一个数据库列
  • 如何在 DB2 中创建返回序列值的函数?

    如何在 DB2 中创建一个从序列中获取值并返回该值的函数 应该可以在 select 或 insert 语句中使用该函数 例如 select my func from xxx insert into xxx values my func 基本
  • 解析带下划线的 SQL Server 数字文字

    我想知道它为什么有效以及为什么它不返回错误 SELECT 2015 11 Result 11 2015 第二种情况 SELECT 2 1 a a 2 1 检查元数据 SELECT name system type name FROM sys
  • posts_search 中的自定义查询

    如何使用此查询作为我的自定义搜索查询 add filter posts search my search is perfect 20 2 function my search is perfect search wp query sWord
  • 数字表与递归 CTE 生成一系列数字

    为什么使用数字表比使用递归 CTE 动态生成它们要快得多 在我的机器上 给定一张桌子numbers单列n 主键 包含从1到100000的数字 查询如下 select n from numbers 大约需要 400 毫秒才能完成 使用递归 C
  • MySQL 与日语字符

    我试图弄清楚如何创建一个表 以便我可以在其中插入日语名字 现在我有 Type InnoDB Encoding UTF 8 Unicode utf8 Collation utf8 general ci 但是 当我插入字符时 它显示为 当我使用
  • SELECT max(x) 返回 null;我怎样才能让它返回0?

    运行以下命令时如何返回 0 而不是 null SELECT MAX X AS MaxX FROM tbl WHERE XID 1 假设没有XID 1的行 or SELECT coalesce MAX X 0 AS MaxX FROM tbl
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别
  • mysql排序和排名语句

    我需要一些 mysql 语句的帮助 我的表 1 有 7 列 表 2 有 8 列 额外的列名为排名 我的语句应该是这样的 从表 1 中选择全部 然后按 用户数 排序 将其插入表 2 中并排名开始 1 2 3 等 table 1 usernam
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同
  • 使用加权行概率从 PostgreSQL 表中选择随机行

    输入示例 SELECT FROM test id percent 1 50 2 35 3 15 3 rows 你会如何编写这样的查询 平均 50 的时间我可以获得 id 1 的行 35 的时间 id 2 的行 15 的时间 id 3 的行
  • 如何获取自定义订单的结果? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 代替ASC or DESC 我希望我的查询结果采用特定的自定义顺序 例如 如果我想要的结果不是 A B C D 而是 P A L H 该怎么

随机推荐

  • 带有两个 ArrayList 的 Android ListView 适配器

    In our chat app we want to use cool new Library SQLBrite https github com square sqlbrite to update chat on database cha
  • 未找到特征“Illuminate\Foundation\Auth\Access\AuthorizesResources”

    有人熟悉我遇到的这个错误吗 请帮忙谢谢 如果您使用 Laravel 5 3 请执行以下操作 来自升级指南 AuthorizesResources Trait AuthorizesResources 特征已与 AuthorizesReques
  • VS 2012 / 2013 AccessViolationException

    当我运行项目 F5 时 我在 IDE 中收到以下异常 An unhandled exception of type System AccessViolationException occurred in System Windows For
  • 仅包含单个 mp4 文件的 MPEG-DASH 视频流

    我研究了一周 寻找一种简单且独立于平台的方法 将 mp4 文件传输到任何浏览器 如果浏览器不兼容 将使用渐进式流 直接下载 方法 我的场景是这样的 单个 mp4 文件 未分段和复用 音频 视频 支持 HTTP 字节范围服务 在浏览器不兼容的
  • Android studio 重命名包后抛出 Nomatching client found

    我按照下面的链接重命名了包 重命名后 当我尝试构建项目时 android studio 会抛出类似的错误 Android Studio重命名包 https stackoverflow com questions 16804093 andro
  • 多个if条件excel,矩阵结构

    Box type Box type Box type Box type BinLoc 810 811 911 822 S1 2 0 1 0 S2 4 2 2 1 S3 12 6 6 3 S4 24 12 12 6 R1 48 24 24 1
  • Akka 消息传递保证

    我正在尝试找出 Akka 支持哪些消息传递保证 我得出以下结论 最多一次 默认支持 至少一次 由 Akka Persistence 支持 恰好一次 Akka支持exactly once吗 如果不这样做 我怎样才能实现这一目标 正如您所发现的
  • 提高处理具有 1 亿个元素的 ArrayList 时的速度和内存消耗

    我使用其中包含短字符串 10 位数字 的文本文件 文件大小约为1 5Gb 因此行数达到1亿行 每天我都会收到另一个文件 需要提取新元素 每天数万个 解决我的问题的最佳方法是什么 我尝试在 ArrayList 中加载数据 每个文件大约需要 2
  • Flutter:如何监听 FirebaseUser 是否已通过电子邮件验证布尔值?

    My Idea 我想在 Flutter 中使用 Firebase Auth 插件来注册用户 但在他们可以访问该应用程序之前 他们必须验证自己的电子邮件地址 因此 我在注册后将 Firebase 用户推送到验证屏幕 这只是一个加载屏幕 告诉用
  • PHPUnit的白名单和黑名单似乎被忽略

    我正在一个项目上设置 PHPUnit 该项目的结构如下 build src service PHP source code files here tests php unit PHP unit tests here bootstrap ph
  • 文本对齐中心 - shell 脚本

    我正在使用 shell 脚本创建一个基于控制台的简单脚本 它将在我的 bash shell 上运行 它是一个简单的基于菜单的驱动显示一些选项集 现在我想根据屏幕尺寸将文本居中对齐 如何将文本对齐到屏幕中央 请帮助我 最后我找到了解决方案 C
  • 在导航栏中添加自定义视图,例如whatsapp

    我想创建自定义导航栏 就像 WhatsApp 用来在应用程序中显示呼叫指示器一样 如下所示 我已成功添加如上所述的视图 但它没有响应 因为我无法检测到状态栏上的触摸 我只能触摸 触摸返回通话 下面的部分 代码如下 property nona
  • 模拟乘法加法的算法

    如何设计一种算法来模拟乘法加法 输入两个整数 它们可能为零 正数或负数 def multiply a b if a 1 return b elif a 0 return 0 elif a lt 0 return multiply a b e
  • XML 注释和“--”

    偶数个 s 似乎也无效 如果它是一些历史特征 那么它的 专业 部分是什么 反对 部分是无法拥有 在评论中 不以 gt 作为注释结尾并允许在内部添加 从而使注释处理复杂化的原因是什么 也许这对某人有帮助 我遇到了一个问题 我想注释掉 XML
  • 保护 EC2 Amazon Marketplace AMI 上的文件夹安全

    我计划创办一家小型企业并向 Amazon 的 AWS Marketplace 提交 Linux AMI 当我阅读卖家指南时 我看到了这一点 AMI 必须允许操作系统级管理功能 以实现合规性要求 漏洞更新和日志文件访问 对于基于 Linux
  • PHP根据.gitignore过滤文件和路径

    我想使用 PHP 读取 gitignore 配置忽略的所有文件和路径 就像 git 的做法一样 可以重复读取目录并对每个文件使用正则表达式进行过滤 但如果路径中的文件过多 则效果不佳 有什么好的和最有效的方法来读取 gitignore 忽略
  • 登录 SQL Server 时出错

    当我想要连接到 SQL Server 2008 时 我收到以下消息 无法连接到服务器 附加信息 无法打开用户默认数据库 登录失败 用户 sa 登录失败 微软 SQL Server 错误 4064 我该如何解决这个错误 这个错误 Micros
  • 在ormlite android中使用DataType.SERIALIZABLE存储对象列表

    如何在android中使用ORMlite保存ArrayList我的模型如下 class Model DatabaseField public String type DatabaseField public String name Data
  • System.Delegate System.Reflection.MethodInfo.CreateDelegate(System.Type)

    据我所知 这个错误在过去曾发生过 当时 Ninject 和站点包的目标是 4 x 并且彼此不匹配 我检查了我的机器 它们匹配 都是 4 0 我确实花了一些时间更新项目中的所有 Nu Get 包 在此之前 并没有出现过这个错误 我怎样才能消除
  • 为什么我的查询返回的结果很多?

    我有一群候选人 他们都做过一份或多份工作 每个人都有一家公司 使用一些技能 糟糕的 ASCII 艺术如下 candidate 1 candidate 2