首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从mySQL中B列中具有一定值的A列中选择所有不同的值

如何从mySQL中B列中具有一定值的A列中选择所有不同的值
EN

Stack Overflow用户
提问于 2019-09-24 06:55:36
回答 4查看 80关注 0票数 1

问题简介:我正在开发条形码跟踪系统,从StationID 1开始,沿着生产线放置5个扫描站,最后一个站是StationID 5。每个条形码对应于沿着生产线制造的一个项目。有些项目,比如条形码95821的,不会经过预处理,因此不会被StationID 1扫描。

问题:我很难构建一个查询,该查询显示所有通过StationID 2但尚未到达StationID 3,或4或5的条形码:列出所有已同时通过StationID 1和StationID 2(类似于95813,95814,95823,95824)的条形码--仅通过StationID 2(类似95821),因为它没有经过预处理。

下面是一个名为扫描器的示例表:

代码语言:javascript
复制
+---------+-----------+----------+
| 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 |
+---------+-----------+----------+

预期结果集:

代码语言:javascript
复制
+---------+
| Barcode |
+---------+
|   95821 |
|   95823 |
|   95824 |
+---------+

我使用下面的查询列出所有已被StationID 1扫描的条形码,并且没有被任何其他站点扫描。

代码语言:javascript
复制
SELECT 
    Barcode
FROM
    scanstations s
GROUP BY Barcode
HAVING SUM(CASE
    WHEN s.StationID = 1 THEN 0
    ELSE 1
END) = 0
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-09-24 09:06:03

我不明白为什么每个人都想让问题复杂化,使用这个查询并不容易

代码语言:javascript
复制
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)

票数 1
EN

Stack Overflow用户

发布于 2019-09-24 08:24:42

按照您的意图,您可以测试分数以下是您的查询。

(查询1)显示通过StationID 2但尚未达到StationID 3或4或5的所有条形码:

SELECT Barcode ,SUM(CASE WHEN s.StationID = 1 THEN -99999999 WHEN s.StationID = 2 THEN 10 WHEN s.StationID = 3 THEN 1 WHEN s.StationID = 4 THEN 1 WHEN s.StationID = 5 THEN 1 ELSE 0 END) as sumcheck FROM scanstations s GROUP BY Barcode HAVING sumcheck >= 10 and sumcheck <= 12

(查询2)列出所有已通过StationID 1和StationID 2的条形码(类似于95813,95814,95823,95824)

SELECT Barcode ,SUM(CASE WHEN s.StationID = 1 THEN 10 WHEN s.StationID = 2 THEN 10 WHEN s.StationID = 3 THEN -99999999 WHEN s.StationID = 4 THEN -99999999 WHEN s.StationID = 5 THEN -99999999 ELSE 0 END) as sumcheck FROM scanstations s GROUP BY Barcode HAVING sumcheck = 20

(查询3)列出所有条形码:-只通过StationID 2(比如95821),因为它没有经过预处理

SELECT Barcode ,SUM(CASE WHEN s.StationID = 1 THEN -99999999 WHEN s.StationID = 2 THEN 10 WHEN s.StationID = 3 THEN -99999999 WHEN s.StationID = 4 THEN -99999999 WHEN s.StationID = 5 THEN -99999999 ELSE 0 END) as sumcheck FROM scanstations s GROUP BY Barcode HAVING sumcheck = 10

我编辑是因为不太清楚。

也许它们并不像您所预期的那么短,但我认为它们很容易理解(如果您有sql的基础),并且对您的逻辑应用更有意义。有时候,这并不是最好的压缩方法,因为如果您在将来进行维护,您将不得不重新解释,这并不总是一个好的选择。

票数 0
EN

Stack Overflow用户

发布于 2019-09-24 08:25:12

你可以试着选择条形码,它有一些不同于最大站号的条形码,例如:

代码语言:javascript
复制
select barcode, max(StationID), count(*)
from  scanstations 
GROUP BY barcode
having  max(StationID) <> count(*)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58074638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档