我有2张这样的表,一个是主实体,一个代表实体的状态,包括旧的。
> entity
id, current_status_id
> status
id, entity_id, name
我这样写了一个查询,以返回当前具有给定状态的实体项目
SELECT e.*
FROM entity e
INNER JOIN status s ON e.current_status_id = s.id
WHERE name = $some_status
但是,让我们说我想向此查询添加一个过滤器,该过滤器已经在Status和Entity之间建立了连接。例如:过去是否具有其他状态。因此,“选择具有给定状态且过去具有其他状态的项目”
我将其添加到上一个查询的末尾:
AND e.id IN (SELECT entity_id FROM status WHERE name = $another_status)
我想知道在这种情况下是否有必要嵌套查询,因为该表已被连接。是否有捷径或良好做法?
谢谢
答案 0 :(得分:1)
您必须使用子查询或一个以上的联接,因为您尝试获取status
表的两个独立子集
SELECT e.*
FROM entity e
INNER JOIN status s ON e.current_status_id = s.id
WHERE name = $some_status
AND EXISTS (
SELECT 1
FROM status
WHERE name = $another_status
AND entity_id = e.id
)
答案 1 :(得分:0)
ON
子句中可以有多个条件
SELECT e.*
FROM entity e
INNER JOIN status s
ON e.current_status_id = s.id
AND s.name IN ('$some_status', '$another_status')
但它的工作方式应该与在where子句中使用的方式完全相同
SELECT *
FROM entity e, status s
WHERE e.current_status_id = s.id
AND s.name IN ('$some_status', '$another_status')
答案 2 :(得分:0)
您可以使用别名使用同一表
SELECT e.*
FROM entity e
INNER JOIN status s1 ON e.current_status_id = s1.id
and s1.name = $some_status
INNER JOIN status s2 ON e.current_status_id = s2.id
and s2.name = $another_status