问题介绍: 我正在开发条形码跟踪系统,该系统沿生产线放置 5 个扫描站,从 StationID 1 开始,最后一个站是 StationID 5。每个条形码对应于沿生产线制造的一个项目。有些元素,例如条码为 95821 的元素,没有经过预处理,因此不会被 StationID 1 扫描。
问题: 我很难构建一个查询来显示所有已通过 StationID 2 但尚未达到 StationID 3、4 或 5 的条形码: 列出所有条形码: - 已通过 StationID 1 和 StationID 2(如 95813、95814、95823、95824) - 仅通过 StationID 2(如 95821),因为它没有经过预处理
这是一个名为 scanstations 的示例表:
+---------+-----------+----------+
| Barcode | StationID | Time |
+---------+-----------+----------+
| 95813 | 1 | 11:30:01 |
| 95814 | 1 | 11:30:05 |
| 95823 | 1 | 11:30:10 |
| 95824 | 1 | 11:30:20 |
| 95821 | 2 | 11:35:10 |
| 95813 | 2 | 11:40:01 |
| 95814 | 2 | 11:40:02 |
| 95823 | 2 | 11:30:10 |
| 95824 | 2 | 11:30:20 |
| 95813 | 3 | 11:40:01 |
| 95814 | 3 | 11:40:02 |
| 95813 | 4 | 11:45:10 |
| 95814 | 4 | 11:45:30 |
| 95813 | 5 | 11:47:20 |
+---------+-----------+----------+
预期结果集:
+---------+
| Barcode |
+---------+
| 95821 |
| 95823 |
| 95824 |
+---------+
我使用以下查询列出所有已被 StationID 1 扫描过且未被任何其他站扫描过的条形码。
SELECT
Barcode
FROM
scanstations s
GROUP BY Barcode
HAVING SUM(CASE
WHEN s.StationID = 1 THEN 0
ELSE 1
END) = 0
最佳答案
我不明白为什么每个人都想复杂化,使用查询并不容易
SELECT Barcode FROM scanstations GROUP BY Barcode HAVING MAX(StationID) = 2
如果你想列出所有 StationID 1 扫描过但没有被任何其他站扫描过的条码,使用 HAVING MAX(StationID) = 1
.
如果要列出所有通过 StationID 1 和 StationID 2 的条形码,请使用 HAVING MAX(StationID) = 2 AND COUNT(*) = MAX(StationID)
如果你只想列出 StationID 为 2 的所有条形码,请使用 HAVING MAX(StationID) = 2 AND COUNT(*) < MAX(StationID)
关于mysql - 如何从 A 列中选择所有不同的值,这些值在 mySQL 的 B 列中具有特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58074638/