You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免WHERE匹配同一行?船舶多船员条件筛选需求

筛选拥有两名不同指定条件船员的舰船

问题背景

现有ships和bridge_officers两张表,一艘舰船对应多名船员。需要筛选出存在两名不同船员的舰船:其中一名船员满足profession = :aprofession,另一名船员满足rank = :brank,排除同一船员同时满足两个条件的情况。

解决方案1:关联时排除同一船员

直接在JOIN条件中添加判断,确保两次关联的是不同的船员,同时改用INNER JOIN(因为我们需要确实存在符合条件的船员,LEFT JOIN无意义):

SELECT a.id
FROM ships AS a 
INNER JOIN bridge_officers AS aBoff ON a.id = aBoff.ship_id
INNER JOIN bridge_officers AS bBoff ON a.id = bBoff.ship_id
WHERE aBoff.profession = :aprofession 
  AND bBoff.rank = :brank
  AND aBoff.id != bBoff.id -- 强制两个关联的是不同船员
GROUP BY a.id

解决方案2:聚合统计验证(更灵活)

通过GROUP BY结合HAVING子句,统计满足不同条件的船员数量,确保两种条件分别由不同船员满足:

SELECT a.id
FROM ships AS a
INNER JOIN bridge_officers AS bo ON a.id = bo.ship_id
WHERE bo.profession = :aprofession OR bo.rank = :brank
GROUP BY a.id
HAVING -- 确保至少有一名船员符合职业条件
       COUNT(DISTINCT CASE WHEN bo.profession = :aprofession THEN bo.id END) >= 1
       -- 确保至少有一名船员符合军衔条件
       AND COUNT(DISTINCT CASE WHEN bo.rank = :brank THEN bo.id END) >= 1
       -- 确保满足条件的船员总数至少为2(排除同一船员同时满足两个条件的情况)
       AND COUNT(DISTINCT bo.id) >= 2

这种方法的优势在于可以轻松扩展到更多筛选条件,比如需要三名不同船员分别满足三个条件时,只需在HAVING中添加对应统计项,并调整总计数要求。

内容的提问来源于stack exchange,提问作者NicholasJohn16

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:12:38