查找共同参与的项目及人员

目前有一张表,专门用来保存报名信息,表中的字段有活动的唯一标识,报名人员唯一标识,参与时间等三个字段

img

现在想通过sql查询共同参与项目的报名人员,比如A11111项目和B22222项目两个都有“张三”,“李四”报名,那就要查询这两个项目的标识。
这个如何查效率较高,没有错误

可以使用SQL的多表查询和聚合函数来实现。假设活动唯一标识为activity_id,报名人员唯一标识为user_id,参与时间为join_time,则可以使用如下的SQL语句:

SELECT user_id
FROM table_name
WHERE activity_id IN ('A11111', 'B22222')
GROUP BY user_id
HAVING COUNT(DISTINCT activity_id) = 2;

上述SQL语句中,IN操作符可以用于指定需要查询的活动唯一标识。GROUP BYCOUNT用于计算每个报名人员在指定的活动中出现的次数,HAVING操作符用于筛选出在两个活动中都出现过的报名人员。这样就可以查询到在两个活动中都参与过的报名人员的唯一标识。使用索引和优化SQL语句可以进一步提高查询效率。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/180081
  • 除此之外, 这篇博客: 微服务项目实战技术点汇总:“尚硅谷的谷粒在线教育”五、阿里云视频点播,完善课程管理模块,(集成富文本插件,大纲管理,信息确认回显,发布完成),手写sql中的 2、获取视频播放地址 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在这里插入图片描述

    package com.test;
    
    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.vod.model.v20170321.GetPlayInfoRequest;
    import com.aliyuncs.vod.model.v20170321.GetPlayInfoResponse;
    
    import java.util.*;
    public class Test {
    /**我这里不使用这个方法**/
    //    /*获取播放地址函数*/
    //    public static GetPlayInfoResponse getPlayInfo(DefaultAcsClient client) throws Exception {
    //        GetPlayInfoRequest request = new GetPlayInfoRequest();
    //        request.setVideoId("视频ID");
    //        return client.getAcsResponse(request);
    //    }
    
        public static void main(String[] args) throws ClientException {
            /**1、根据视频id获取视频播放地址**/
            //1、创建初始化对象
            DefaultAcsClient client = InitVodClient.initVodClient("你的id", "你的密钥");
    
            //2、创建获取视频地址request请求对象和response响应对象
            GetPlayInfoRequest request=new GetPlayInfoRequest();
            GetPlayInfoResponse response = new GetPlayInfoResponse();
    
            //3、设置请求的视频id(从你的阿里云中找)
            request.setVideoId("你视频的id");
    
            //4、 根据初始化对象,获取数据,返回一个响应体对象
            response = client.getAcsResponse(request);//返回GetPlayInfoResponse对象response,里面封装了视频的所有信息
    
            try {
                List<GetPlayInfoResponse.PlayInfo> playInfoList = response.getPlayInfoList();
                //播放地址
                for (GetPlayInfoResponse.PlayInfo playInfo : playInfoList) {
                    System.out.print("PlayInfo.PlayURL = " + playInfo.getPlayURL() + "\n");
                }
                //Base信息
                System.out.print("VideoBase.Title = " + response.getVideoBase().getTitle() + "\n");
            } catch (Exception e) {
                System.out.print("ErrorMessage = " + e.getLocalizedMessage());
            }
            System.out.print("RequestId = " + response.getRequestId() + "\n");
        }
    }
    
    

    在这里插入图片描述

  • 以下回答由chatgpt基于相关博客总结生成:

    我可以根据提供的报名信息表格,通过 SQL 查询共同参与两个或多个项目的人员。具体的解决方案如下:

    1. 根据活动唯一标识进行分组,筛选出参与两个或多个项目的人员。
    SELECT a."报名人员唯一标识"
    FROM "报名信息表格" a
    WHERE a."活动唯一标识" IN ('A11111', 'B22222')
    GROUP BY a."报名人员唯一标识"
    HAVING COUNT(DISTINCT a."活动唯一标识") = 2 -- 两个项目的活动唯一标识个数是2,可根据实际情况调整
    
    1. 接下来,我们可以进一步查询筛选出的人员的信息。这里有两种方法,一种是使用 INNER JOIN 子句,另一种是使用 IN 子句。(两种方法结果等价)

    (1)使用 INNER JOIN 子句

    SELECT a.*
    FROM "报名信息表格" a
    INNER JOIN
    (
      SELECT t."报名人员唯一标识"
      FROM "报名信息表格" t
      WHERE t."活动唯一标识" IN ('A11111', 'B22222')
      GROUP BY t."报名人员唯一标识"
      HAVING COUNT(DISTINCT t."活动唯一标识") = 2
    ) b
    ON a."报名人员唯一标识" = b."报名人员唯一标识"
    

    (2)使用 IN 子句

    SELECT *
    FROM "报名信息表格"
    WHERE "报名人员唯一标识" IN
    (
      SELECT t."报名人员唯一标识"
      FROM "报名信息表格" t
      WHERE t."活动唯一标识" IN ('A11111', 'B22222')
      GROUP BY t."报名人员唯一标识"
      HAVING COUNT(DISTINCT t."活动唯一标识") = 2
    )
    

    以上是针对题目的具体解决方案。另外,参考资料中提供了一个补充时间范围内丢失的值的场景,使用 WITH 和 CONNECT BY 连接查询语句生成年份列表,再通过 RIGHT JOIN 或者 OUTER JOIN 与真实表格进行关联查询。这个解决方案可以拓展到此类场景。