MySQL:至少参与xxx参与的全部事件

news2024/11/18 13:47:58

MySQL:至少参与xxx参与的全部事件 – WhiteNight's Site

标签:MySQL, 数据库

这玩意,期末要考,还是重点。所以不得不仔细思考思考怎么写了。

什么时候用NOT EXISTS

双重否定表肯定

之前虽然已经讲过了,不过那一篇文章讲的是参与了全部事件的xxx,而本文相比于那篇文章还多了一个限制条件:参与的是xxx参与的全部事件。

等会我们会用具体例子来解释什么叫“参与了xxx参与的全部事件”,现在先来回顾一下什么时候要用嵌套NOT EXISTS查询。

假设我要找出购买了全部商品的顾客,能用EXISTS吗?不行。因为EXISTS只要碰到任意一条匹配的记录就会退出循环,并返回true。

那我们只能用EXISTS去查询“没有购买全部商品的用户”,再在最外层套层NOT EXISTS,表示“查询不存在没有购买全部商品的用户”,原理总的来说就是:双重否定表肯定。

具体例子

查询至少参与了xxx参与的全部事件的对象

首先理解这句话是啥意思:查询至少参与了A参与的全部事件的对象B。

“至少”,那么意味着B除了参与了A参与的全部事件,还有可能参与了A没有参与的事件。

但这部分我们并不需要管,我们只需要先查询出A参与了哪些事件,得到结果集firstset;再对firstset查询B是否有参与firstset中的全部事件,最后即可得到结果。

这里以头歌的两道题为例。

用 NOT EXISTS 实现查询至少参与过”202002020217″选手参与过的所有比赛的选手信息

先筛选,再查询

任务描述

用 NOT EXISTS 实现查询至少参与过”202002020217″选手参与过的所有比赛的选手信息,contest_id不为NULL

相关知识

1、users为选手信息表; users表如下图(仅显示前几条):

,

现已构建users表,结构信息如下:

,

2、solution为选手提交的题目解答 solution表如下图(仅显示前几条):

,

现已构建solution表,结构信息如下:

,

怎么写呢?首先我们要先筛选,筛选出A参与了哪些比赛,再对得到的结果集进行二次筛选。

单纯查询“A参与的全部比赛”并不难。However,在solution表中,contest_id可能为空,表示“该题目不属于任意比赛。所以我们要作个非空判断。

SELECT *
FROM solution AS B
WHERE B.user_id='202002020217' AND B.contest_id IS NOT NULL

此时我们得到了第一个结果集firstset。这个结果集包含了所有A参与的比赛。那么接下来就是进行二次筛选,找出哪些人参与的比赛都能在firstset中找到记录。

那么最内层的NOT EXISTS就表示:

  • 如果有个B人对于A参与的任意比赛都没有参与,那它肯定不是我们要找的对象;
  • 如果有个B人只参与了部分A参与的比赛,虽然能匹配到部分比赛的记录,但是由于内层循环会匹配每一条记录,即它会去匹配所有A参与过的比赛。那么对于剩下B没参加的比赛而言它仍然找不到匹配的记录。

上面这两种情况都会导致内层的NOT EXISTS最后返回true。而true对与最外层的NOT EXISTS而言,就相当于在告诉它:不要选择这些条件为true的记录。所以最后我们才能得到“参与了A参与的全部比赛的选手”。

SELECT A.*
FROM users AS A 
WHERE NOT EXISTS(
    SELECT 1
    FROM solution AS B
    WHERE B.user_id='202002020217' AND B.contest_id IS NOT NULL
    AND NOT EXISTS(
        SELECT 1
        FROM solution AS C
        WHERE A.user_id=C.user_id AND B.contest_id=C.contest_id
    )
)

总的来说,这种题的重点

  • 先对哪个结果集进行筛选?(条件筛选)
  • 最后得到的结果集应由哪些记录组成?(逐条筛选)
  • 条件有没有可能为NULL?(因为NOT EXISTS无法判断NULL,它会把所有为NULL的记录都当作“存在”并返回true)

第7关:求至少用了供应商 S1所供应的全部零件的工程号 JNO

先看懂题

这种题要是能看懂题目,再套两个NOT EXISTS就差不多能写出来了。问题是能不能看懂题。

任务描述

求至少用了供应商 S1所供应的全部零件的工程号 JNO

相关知识

供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY。 SPJ表如下图:

,

现已构建SPJ表,结构信息如下:

,

我反正是第一眼没看懂。什么玩意?什么叫用了供应商S1供应的全部零件?我看不懂啊。

再仔细看看,S1就供应了两种零件,P1和P2。简单来说,这么长一句话浓缩之后就是:找出用过P1和P2的工程。我也真的是服了出题人了,这句子都能给你想到。

那么还是老样子,先条件筛选再逐条筛选。条件是什么?S1生产的零件。那么先条件筛选

SELECT B.*
FROM SPJ AS B 
WHERE SNO='S1'

接下来对上面得到的结果集firstset逐条筛选,也就是套两个NOT EXISTS

SELECT DISTINCT A.JNO
FROM SPJ AS A 
WHERE NOT EXISTS(
    SELECT B.*
    FROM SPJ AS B 
    WHERE SNO='S1'
    AND NOT EXISTS(
        SELECT C.*
        FROM SPJ AS C 
        WHERE B.PNO=C.PNO AND A.JNO=C.JNO
    )
)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1138562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Apache ActiveMQ RCE漏洞复现(CNVD-2023-69477)

0x01 产品简介 ActiveMQ是一个开源的消息代理和集成模式服务器,它支持Java消息服务(JMS) API。它是Apache Software Foundation下的一个项目,用于实现消息中间件,帮助不同的应用程序或系统之间进行通信。 0x02 漏洞概述 Apache ActiveMQ 中存…

Flink on yarn 加载失败plugins失效问题解决

Flink on yarn 加载失败plugins失效问题解决 flink版本:1.13.6 1. 问题 flink 任务运行在yarn集群,plugins加载失效,导致通过扩展资源获取任务参数失效 2. 问题定位 yarn容器的jar包及插件信息,jar包是正常上传 源码定位 加载plugins入口,TaskMana…

Go学习第十章——文件操作,Json和测试

Go文件操作,Json和测试 1 文件1.1 基本介绍1.2 读取的基本操作1.3 写入的基本操作1.4 使用案例(三个) 2 Go语言的Json使用2.1 序列化案例2.2 反序列化案例 3 单元测试3.1 先看个需求3.2 快速入门3.3 入门总结 1 文件 1.1 基本介绍 文件在程序中是以流的形式来操作…

Android环境变量macOS环境变量配置

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览macOS基础知识 三、设置环境变量3.1 终…

【iOS免越狱】利用IOS自动化web-driver-agent_appium-实现自动点击+滑动屏幕

1.目标 在做饭、锻炼等无法腾出双手的场景中,想刷刷抖音 刷抖音的时候有太多的广告 如何解决痛点 抖音自动播放下一个视频 iOS系统高版本无法 越狱 安装插件 2.操作环境 MAC一台,安装 Xcode iPhone一台,16 系统以上最佳 3.流程 下载最…

Android Studio 导出 jar

AS版本:Android Studio Giraffe | 2022.3.1 Patch 1 1、File——New Module——Android Library 2、mylibrary——main——新建功能类 3、mylibrary——build.gradle——android {}内复制以下代码——Sync Now //Copy类型 tasks.register(makeJar, Copy) { //删…

Python深度学习实战-基于tensorflow原生代码搭建BP神经网络实现分类任务(附源码和实现效果)

实现功能 前面两篇文章分别介绍了两种搭建神经网络模型的方法,一种是基于tensorflow的keras框架,另一种是继承父类自定义class类,本篇文章将编写原生代码搭建BP神经网络。 实现代码 import tensorflow as tf from sklearn.datasets import…

[推荐]Linux安装与配置虚拟机之虚拟机服务器坏境配置

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 ,越幸运。 一.操作系统 1. 简介 操作系统(perating System,简称OS)是一种系统软件…

测试C#调用Vlc.DotNet组件播放视频

除了Windows Media Player组件,在百度上搜索到还有不少文章介绍采用Vlc.DotNet组件播放视频,关于Vlc.DotNet的详细介绍见参考文献1,本文学习Vlc.DotNet的基本用法。   VS2022中新建基于.net core的winform程序,在Nuget包管理器中…

Qt+JSON简单例子

QtJSON简单例子 QtJSONexample2参考 QtJSON #include "mainwindow.h" #include "ui_mainwindow.h" #include <QtDebug> #include <QJsonObject> #include <QJsonArray> #include <QJsonDocument> #include <QTextCodec> #i…

MarkDown详细入门笔记

本帖整理了MarkDown的入门学习笔记~ 一.介绍 Markdown 是一种轻量级的「标记语言」&#xff0c;它的优点很多&#xff0c;目前也被越来越多的写作爱好者&#xff0c;撰稿者广泛使用。 诸如微信公众平台、CSDN博客、还有Typora中写文档的部分&#xff0c;均涉及到MD的功能~ 它…

【rust/esp32】wsl2开发环境搭建与测试

文章目录 说在前面流程可能的问题wsl2相关rust相关vscode相关build相关 测试吐槽参考 说在前面 esp型号&#xff1a;esp32s3开发环境&#xff1a;wsl2rustc版本&#xff1a;rustc 1.73.0-nightlyesp idf版本&#xff1a;v5.1.1 流程 目前是按照这个demo的流程可以跑通修改demo…

【spark客户端】Spark SQL CLI详解:怎么执行sql文件、注释怎么写,支持的文件路径协议、交互式模式使用细节

文章目录 一. Spark SQL Command Line Options(命令行参数)二. The hiverc File1. without the -i2. .hiverc 介绍 三. 支持的路径协议四. 支持的注释类型五. Spark SQL CLI交互式命令六. Examples1. running a query from the command line2. setting Hive configuration vari…

influxdb基本使用及其源码解析

文章目录 基本介绍简介属性特点场景 相关概念seriesseries cardinalityShardShard groupShard DurationRetention policyTSMLSM 源码解析编译IDE调试服务启动metaShardShard groupRetentionPolicyDatabaseInfo Data数据写入SeriesIndexInmem Indextsi index StoreShardEngineTS…

【Javascript】函数之形参与实参

function c(a,b){return ab;}var sumc(3,4);console.log(sum);a,b为形参 3,4为实参 形参和实参是⼀⼀对应的数量可以不对应参数的类型不确定函数可以设置默认参数实参可以是字⾯量也可以是变量

规则推理桌游

目录 Eleusis Express 1&#xff0c;规则 2&#xff0c;出牌规则示例 3&#xff0c;中文规则 Eleusis Express 原文&#xff1a;Eleusis Express 1&#xff0c;规则 简单来说就是需要一个主持人想一个出牌规则&#xff0c;其他人通过出牌试探过程推理出这个出牌规则。 …

python:使用Flask-SQLAlchemy对数据库增删改查的简单示例

以下将介绍Flask-SQLAlchemy对数据库增删改查的简单示例。 一、安装所需的库 pip install flask flask-sqlalchemy flask-mysql 二、创建数据表 本示例使用mysql创建数据库和表 CREATE TABLE user ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(255) DEFAULT NULL…

数据结构与算法-二叉树的遍历

&#x1f31e; “少年没有乌托邦&#xff0c;心向远方自明朗&#xff01;” 二叉树 &#x1f388;1.二叉树的遍历&#x1f52d;1.1先序遍历&#x1f52d;1.2中序遍历&#x1f52d;1.3后序遍历&#x1f52d;1.4层次遍历&#x1f52d;1.5二叉树遍历的递归算法&#x1f4dd;1.5.1先…

centos部署tomcat

Java Downloads | Oracle

mq的使用方法

mq的使用方法 1、先写好自己的业务以及只会需要mq异步调用的业务 2、在先前的业务中发送mq消息 mqProducer.syncSend(ActivityRedisConstant.TOPIC_SAVE_SIGNUP, saveSignUpMsg); 3、设定好mq的topic消息主题 Value(“${mq.signup-topic:saas-signup}”)从nacos中取如果没…