目前有一张表,专门用来保存报名信息,表中的字段有活动的唯一标识,报名人员唯一标识,参与时间等三个字段
现在想通过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 BY
和COUNT
用于计算每个报名人员在指定的活动中出现的次数,HAVING
操作符用于筛选出在两个活动中都出现过的报名人员。这样就可以查询到在两个活动中都参与过的报名人员的唯一标识。使用索引和优化SQL语句可以进一步提高查询效率。
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");
}
}
我可以根据提供的报名信息表格,通过 SQL 查询共同参与两个或多个项目的人员。具体的解决方案如下:
SELECT a."报名人员唯一标识"
FROM "报名信息表格" a
WHERE a."活动唯一标识" IN ('A11111', 'B22222')
GROUP BY a."报名人员唯一标识"
HAVING COUNT(DISTINCT a."活动唯一标识") = 2 -- 两个项目的活动唯一标识个数是2,可根据实际情况调整
(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 与真实表格进行关联查询。这个解决方案可以拓展到此类场景。