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的精彩解释