![](/img/trans.png)
[英]MySQL Query: Return all rows with a certain value in one column when value in another column matches specific criteria
[英]mySQL Join Tables but exclude ALL rows with a certain ID/value based on matching criteria from another column (criteria contained in only some rows)
对 SQL 来说非常新,所以我什至不知道如何正确表达我的问题,也许这就是我似乎找不到答案的原因。 我要做的基本上是根据另一列的匹配条件通过 ID 列从表中包含或排除所有行。 相反,仅包含/排除具有条件的行,而不是所有具有匹配 ID 的行。
我想我基本上是在尝试做这个问题中提出的问题,但是由于缺少权限,我不能在 mySQL 中使用“创建临时表”命令(我假设任何其他临时表方法也会因为这个原因而失败...... )
我有两张桌子:
批处理表
批号 | 信息 |
---|---|
100 | BBB |
101 | AAA |
102 | AAA |
样本表
样品编号 | 样品类型 | 批号 | 地位 |
---|---|---|---|
1 | 批次_QC_1 | 100 | '经过' |
2 | 批次_QC_1 | 100 | '经过' |
3 | 批次_QC_2 | 100 | '经过' |
4 | 批次_QC_2 | 100 | '经过' |
5 | 常规的 | 100 | '积极的' |
6 | 常规的 | 100 | '积极的' |
7 | 常规的 | 100 | '消极的' |
8 | 常规的 | 100 | '消极的' |
9 | 批次_QC_1 | 101 | '经过' |
10 | 批次_QC_1 | 101 | 'QC_1 失败' |
11 | 批次_QC_2 | 101 | '经过' |
12 | 批次_QC_2 | 101 | '经过' |
13 | 常规的 | 101 | '积极的' |
14 | 常规的 | 101 | '积极的' |
15 | 常规的 | 101 | '消极的' |
16 | 常规的 | 101 | '消极的' |
我需要组合 batch_table 和 sample_table,只保留“通过的批次”。 每个批次都是 batch_table 中的一个键。 我需要检查 sample_table 的内容以查看批次是否已通过。 通过定义为 Status 列 = 'pass' 的所有行,其中 SampleType 为 'Batch_QC_1' 或 'Batch_QC_2'。 然后我想通过整个 BatchNo 包含/排除。 所以在示例数据中,因为有一行 (sampleNo = 10),其中 Status 列不是“pass”,SampleType 列是“Batch_QC_1”。 我想排除所有具有相同 BatchNo ('101') 的行,而不仅仅是那个。
我已经尝试了很多事情——大多数似乎只删除了不等于“通过”的行,并且确实删除了具有相同匹配 BatchNo 的所有行。
例如,我尝试过这样的事情:
SELECT
sample_table.SampleNo, sample_tables.SampleType, sample_table.BatchNo, sample_table.Status, batch_table.Info
FROM
batch_table
JOIN sample_table on batch_table.BatchNo = sample_table.BatchNo
WHERE sample_table.Status NOT IN ('QC_1_FAIL', 'QC_2_FAIL')
这将返回状态 = 'QC_2_FAIL' 的 sample_table 中除 row/sampleNo 10 之外的所有行。 我想要排除与第 10 行具有相同 BatchNo 的所有行(或具有匹配条件的任何行)。
查询结果(排除单行,SampleNo = 10)
样品编号 | 样品类型 | 批号 | 地位 | 信息 |
---|---|---|---|---|
1 | 批次_QC_1 | 100 | '经过' | BBB |
2 | 批次_QC_1 | 100 | '经过' | BBB |
3 | 批次_QC_2 | 100 | '经过' | BBB |
4 | 批次_QC_2 | 100 | '经过' | BBB |
5 | 常规的 | 100 | '积极的' | BBB |
6 | 常规的 | 100 | '积极的' | BBB |
7 | 常规的 | 100 | '消极的' | BBB |
8 | 常规的 | 100 | '消极的' | BBB |
9 | 批次_QC_1 | 101 | '经过' | AAA |
11 | 批次_QC_2 | 101 | '经过' | AAA |
12 | 批次_QC_2 | 101 | '经过' | AAA |
13 | 常规的 | 101 | '积极的' | AAA |
14 | 常规的 | 101 | '积极的' | AAA |
15 | 常规的 | 101 | '消极的' | AAA |
16 | 常规的 | 101 | '消极的' | AAA |
期望的结果(排除 BatchNo = 101 的所有行)
样品编号 | 样品类型 | 批号 | 地位 | 信息 |
---|---|---|---|---|
1 | 批次_QC_1 | 100 | '经过' | BBB |
2 | 批次_QC_1 | 100 | '经过' | BBB |
3 | 批次_QC_2 | 100 | '经过' | BBB |
4 | 批次_QC_2 | 100 | '经过' | BBB |
5 | 常规的 | 100 | '积极的' | BBB |
6 | 常规的 | 100 | '积极的' | BBB |
7 | 常规的 | 100 | '消极的' | BBB |
8 | 常规的 | 100 | '消极的' | BBB |
我也尝试使用左/右连接的变体,但我认为我的问题更多在于我不知道如何正确构建查询的 WHERE 部分。 我认为临时表可能有效,但由于权限,我似乎无法这样做。 如果无法使用标准 WHERE 子句,那么是否可以使用临时变量来创建额外的通过/失败列? 太感谢了。
SELECT s.SampleNo, s.SampleType, s.BatchNo, s.Status, b.Info FROM sample_table s
INNER JOIN batch_table b on s.BatchNo = b.BatchNo
WHERE s.BatchNo NOT IN (
SELECT DISTINCT(BatchNo) FROM sample_table WHERE Status != 'pass' AND
SampleType IN ('Batch_QC_2', 'Batch_QC_1')
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.