Mysql 如果SELECT中存在空列,则删除不同的行

Mysql 如果SELECT中存在空列,则删除不同的行,mysql,sql,Mysql,Sql,我有一张交易表 History[CustomerID, BikeID,Checkout,StationIDout,Checkin,StationIDin] 其中Checkout和Checkin是GETDATE() 我想查询历史记录,以便接收当前位于给定站点ID的自行车(即签入和站点ID为非空) 我当前正在使用此查询: SELECT DISTINCT BikeID from History where StationIDin = {0} AND Checkin IS NOT NULL AND

我有一张交易表

History[CustomerID, BikeID,Checkout,StationIDout,Checkin,StationIDin]
其中
Checkout
Checkin
GETDATE()

我想查询
历史记录
,以便接收当前位于给定站点ID的自行车(即
签入
站点ID
非空

我当前正在使用此查询:

SELECT DISTINCT BikeID from History
where StationIDin = {0} 
AND Checkin IS NOT NULL AND StationIDin IS NOT NULL
毫不奇怪,我仍然收到已签出的自行车,因为我的查询会选择它在完成事务中看到的第一个
BikeID
,而不会搜索另一个未签回同一辆自行车的实例

我想形成一个查询,该查询不选择签出的NOT选择
BikeID
。换句话说,在StationIn中搜索任何出现的NULL,并在选择
BikeID
之前将其从结果中删除

(我为可能错误命名的标题道歉,我无法更好地描述它)


使用自连接筛选出与自行车ID匹配且未签入的结果

SELECT DISTINCT h1.BikeID
FROM History AS h1
LEFT JOIN History AS h2 ON h1.BikeID = h2.BikeID AND (h2.Checkin IS NULL OR h2.StationIDin IS NULL)
WHERE h1.Checkin IS NOT NULL AND h2.StationIDin IS NOT NULL
AND h2.BikeID IS NULL

使用
分组依据
,而不是
选择不同的

SELECT BikeID 
FROM History h
WHERE StationIDin = {0} 
GROUP BY BikeId
HAVING SUM(CheckIn IS NULL) = 0;

这会将所有没有签入记录的自行车返回为
NULL

是否可以发布一些示例数据和预期结果?将所有数据保存在一个表中,这不是正确的方法。而且容易出错。重新考虑您的设计,将每辆自行车的当前状态保存在一张表中,并将其历史记录保存在另一张表中。在当前状态表中,每辆自行车必须恰好出现一次。在历史记录表中,自行车可以出现零次或多次。
SELECT BikeID 
FROM History h
WHERE StationIDin = {0} 
GROUP BY BikeId
HAVING SUM(CheckIn IS NULL) = 0;