Mysql 使用连接过滤数据
我在一个名为Mysql 使用连接过滤数据,mysql,sql,Mysql,Sql,我在一个名为PROD | Project | Position | Status | |---------|----------|--------| | 1 | 1 | A | | 1 | 2 | A | | 2 | 1 | A | | 2 | 2 | B | | 3 | 1 | B | | 3 | 2
PROD
| Project | Position | Status |
|---------|----------|--------|
| 1 | 1 | A |
| 1 | 2 | A |
| 2 | 1 | A |
| 2 | 2 | B |
| 3 | 1 | B |
| 3 | 2 | B |
| 4 | 1 | A |
| 4 | 2 | A |
我正在尝试获取至少有一个位置且状态=B
的所有项目
| Project | Position | Status |
|---------|----------|--------|
| 2 | 1 | A |
| 2 | 2 | B |
| 3 | 1 | B |
| 3 | 2 | B |
我曾经尝试过这样使用连接:
SELECT*FROM PROD A JOIN PROD B ON A.PROD-Project=B.PROD-Project,其中B.PROD-Status='B'
这给了我一个空洞的回答 您可以尝试在子查询中使用连接
select * from PROD
INNER JOIN (
select distinct project
from PROD
where status ='B';
) t on t.project = PROD.project
您可以尝试在子查询中使用连接
select * from PROD
INNER JOIN (
select distinct project
from PROD
where status ='B';
) t on t.project = PROD.project
存在时
:
SELECT p.* FROM PROD p
WHERE EXISTS (
SELECT 1 FROM PROD
WHERE Project = p.Project AND Status = 'B'
)
或在
中使用:
SELECT * FROM PROD
WHERE Project IN (SELECT Project FROM PROD WHERE Status = 'B')
SELECT DISTINCT p.*
FROM PROD p JOIN PROD pp
ON pp.Project = p.Project
WHERE pp.Status = 'B'
如果您想要一个带有的解决方案,请加入:
SELECT * FROM PROD
WHERE Project IN (SELECT Project FROM PROD WHERE Status = 'B')
SELECT DISTINCT p.*
FROM PROD p JOIN PROD pp
ON pp.Project = p.Project
WHERE pp.Status = 'B'
请参阅。
结果:
存在时
:
SELECT p.* FROM PROD p
WHERE EXISTS (
SELECT 1 FROM PROD
WHERE Project = p.Project AND Status = 'B'
)
或在
中使用:
SELECT * FROM PROD
WHERE Project IN (SELECT Project FROM PROD WHERE Status = 'B')
SELECT DISTINCT p.*
FROM PROD p JOIN PROD pp
ON pp.Project = p.Project
WHERE pp.Status = 'B'
如果您想要一个带有的解决方案,请加入:
SELECT * FROM PROD
WHERE Project IN (SELECT Project FROM PROD WHERE Status = 'B')
SELECT DISTINCT p.*
FROM PROD p JOIN PROD pp
ON pp.Project = p.Project
WHERE pp.Status = 'B'
请参阅。
结果:
我正在尝试获取至少有一个Status=B职位的所有项目
无需加入,只需执行以下操作:
选择不同的产品项目,其中PROD.Status='B'
我正在尝试获取至少有一个Status=B职位的所有项目
无需加入,只需执行以下操作:
选择不同的PROD.Project,其中PROD.Status='B'在实际表中是否有更多列??正如示例数据所示,您存储的是冗余数据,理想情况下,此数据可以/应该更好地规范化。@RaymondNijland实际数据有点混乱。它实际上来自一个COBOL DAT文件。您的实际表中有更多的列吗??正如示例数据所示,您存储的是冗余数据,理想情况下,此数据可以/应该更好地规范化。@RaymondNijland实际数据有点混乱。它实际上来自一个COBOL DAT文件。由于PROD pp表上的过滤器,左连接作为内部连接提供结果,因此理想情况下,您希望使用内部连接优化see@forpas。SELECT 1
在具有EXISTS
的第一个解决方案中是什么意思?@g3blv它是一个不重要的伪列。它可以是选择0
或选择*
。这里重要的一点是,select返回或不返回
simething so EXISTS是true还是false。@g3blv EXISTS需要一个布尔值SELECT 1
是最确定的写入方式,但它实际上与您编写的内容无关,至少在MySQL中是这样。请参阅RaymondNijland和forpas精彩的解释。由于PROD pp表上的过滤器,左连接将结果作为内部连接提供,因此理想情况下,您应该使用内部连接来优化see@forpas。SELECT 1
在具有EXISTS
的第一个解决方案中是什么意思?@g3blv它是一个不重要的伪列。它可以是选择0
或选择*
。这里重要的一点是,select返回或不返回
simething so EXISTS是true还是false。@g3blv EXISTS需要一个布尔值SELECT 1
是最可靠的写入方式,但写什么并不重要,至少在MySQL中不重要,请参见RaymondNijland和forpas的精彩解释