我有一个包含两个表的数据库,
ships
和 officers
。一个ship
有多个officers
。要搜索具有特定ship
的officer
,我有这样的查询:
SELECT a.id
FROM ships AS a
LEFT JOIN bridge_officers AS aBoff ON a.id = aBoff.ship_id
WHERE aBoff.profession = :aprofession
GROUP BY a.id
这将导致所有具有
ships
的officer
具有:aprofession
。相同的JOIN
/WHERE
被重复过滤超过一个officer
.
例如:
SELECT a.id
FROM ships AS a
LEFT JOIN bridge_officers AS aBoff ON a.id = aBoff.ship_id
LEFT JOIN bridge_officers AS bBoff ON a.id = bBoff.ship_id
WHERE aBoff.profession = :aprofession AND bBoff.rank = :brank
GROUP BY a.id
这将导致所有
ships
具有 :aprofession
和 :brank
officers
。我想要的行为是只返回符合这些条件的两个不同的officers
。如果一个 officer
同时具有 :aproffesion
和 :brank
,它将返回那艘船。如果每个WHERE
条件只匹配一个连接,我更愿意。
有没有办法做到这一点?谢谢!
为第二个 JOIN 添加另一个条件,它是不同的官员。
SELECT DISTINCT a.id
FROM ships AS a
LEFT JOIN bridge_officers AS aBoff ON a.id = aBoff.ship_id
LEFT JOIN bridge_officers AS bBoff ON a.id = bBoff.ship_id AND aBoff.id != bBoff.id
WHERE aBoff.profession = :aprofession AND bBoff.rank = :brank
在连接条件中添加条件以防止同行匹配:
LEFT JOIN bridge_officers AS bBoff ON a.id = bBoff.ship_id
AND aBoff.id < bBoff.id
选择
<
而不是!=
将中间结果集减半;只产生任何两名军官的独特组合。
此外,
where
条款中似乎存在错误 - 您的问题说明
where
检查官员是否作为某种职业和other 官员是否有一定的等级 - 似乎条件应该应用于同一个连接表
WHERE aBoff.profession = :aprofession
AND bBoff.rank = :brank
:
aBoff
您的查询还有另一个微妙的问题:通过将
WHERE aBoff.profession = :aprofession
AND aBoff.rank = :brank -- aBoff.rank, not bBoff.rank
子句应用于外部联接表,您将它们转换为 inner联接,因为联接行必须存在(并被联接到)才能使
where
子句是真的,所以
where
关键字在这里没有意义,为了清楚起见应该删除:
LEFT