如何在SQL查询中新增字段标识工作表是教师自制还是已点赞
解决方法:添加来源类型区分字段
我来帮你调整这个SQL语句,不仅能返回目标工作表,还能清晰标注每个表的来源类型,同时优化一下原语句的性能:
通用方案(适配大多数数据库,如MySQL、PostgreSQL、SQL Server等)
使用CASE WHEN语句可以灵活处理各种情况,包括教师给自己的工作表点赞的重叠场景:
SELECT w.title, w.worksheet_id, CASE -- 优先判断既是自制又是点赞的情况 WHEN w.teacher_id = 5 AND EXISTS (SELECT 1 FROM likes l WHERE l.worksheet_id = w.worksheet_id AND l.teacher_id = 5) THEN '自制且点赞的工作表' -- 仅自制的情况 WHEN w.teacher_id = 5 THEN '自制工作表' -- 仅点赞的情况 WHEN EXISTS (SELECT 1 FROM likes l WHERE l.worksheet_id = w.worksheet_id AND l.teacher_id = 5) THEN '点赞的工作表' END AS source_type FROM worksheets w WHERE -- 筛选条件简化为两种情况:自制 或 点赞 w.teacher_id = 5 OR EXISTS (SELECT 1 FROM likes l WHERE l.worksheet_id = w.worksheet_id AND l.teacher_id = 5);
MySQL专属简化方案
如果你用的是MySQL,也可以用IF函数快速实现(如果不需要区分重叠场景的话):
SELECT w.title, w.worksheet_id, -- 直接判断是否为自制,否则就是点赞的 IF(w.teacher_id = 5, '自制工作表', '点赞的工作表') AS source_type FROM worksheets w WHERE w.teacher_id = 5 OR EXISTS (SELECT 1 FROM likes l WHERE l.worksheet_id = w.worksheet_id AND l.teacher_id = 5);
为什么原方案里的IF没生效?
大概率是因为你没处理好重叠场景(教师给自己的表点赞),或者没有用关联条件正确判断点赞关系。上面的写法用EXISTS替代了原语句的IN,不仅性能更优,还能更精准地关联工作表和点赞记录。
内容的提问来源于stack exchange,提问作者Martijn
相关产品推荐
相关产品推荐

