asp.net - 限制mysql查询的记录数

标签 asp.net mysql sql

我写了一个查询:

SELECT TimeStamp, FwdHr, W FROM Meter_Data 
WHERE TimeStamp Between 1356908255 AND 1356944255 
OR (TimeStamp BETWEEN 1356911855 AND 1356947855) 
OR (TimeStamp BETWEEN 1356915455 AND 1356951455) 
OR (TimeStamp BETWEEN 1356919055 AND 1356955055) 
OR (TimeStamp BETWEEN 1356922655 AND 1356958655) 
AND MeterID = @meterID 
AND DeviceID = @deviceID 
ORDER BY TimeStamp

但问题是它为每个 Between 子句返回多条记录,但我只想要一条。 LIMIT 将限制整个查询的总记录数 = 1。所以不能使用它。请帮忙!

最佳答案

使用一系列 UNIONed 查询:-

(SELECT TimeStamp, FwdHr, W 
FROM Meter_Data 
WHERE TimeStamp Between 1356908255 AND 1356944255 
AND MeterID = @meterID
AND DeviceID = @deviceID 
ORDER BY TimeStamp
LIMIT 1)
UNION
(SELECT TimeStamp, FwdHr, W 
FROM Meter_Data 
WHERE TimeStamp BETWEEN 1356911855 AND 1356947855
AND MeterID = @meterID 
AND DeviceID =     @deviceID 
ORDER BY TimeStamp
LIMIT 1)
UNION
(SELECT TimeStamp, FwdHr, W 
FROM Meter_Data 
WHERE TimeStamp BETWEEN 1356915455 AND 1356951455
AND MeterID = @meterID 
AND DeviceID =     @deviceID 
ORDER BY TimeStamp
LIMIT 1)
UNION
(SELECT TimeStamp, FwdHr, W 
FROM Meter_Data 
WHERE TimeStamp BETWEEN 1356919055 AND 1356955055
AND MeterID = @meterID 
AND DeviceID =     @deviceID 
ORDER BY TimeStamp
LIMIT 1)
UNION
(SELECT TimeStamp, FwdHr, W 
FROM Meter_Data 
WHERE TimeStamp BETWEEN 1356922655 AND 1356958655
AND MeterID = @meterID 
AND DeviceID =     @deviceID 
ORDER BY TimeStamp
LIMIT 1)

您可能需要更改参数名称并根据您的数据库类多次传递它们

另一种可能性(但未经测试)是让子选择获取仪表 id/设备 id 的每个范围内的最大时间戳,添加 CASE 语句来获取行所在的范围并按该范围进行分组,然后加入结果返回到主表。

请注意,如果仪表 ID/设备 ID 组合存在重复的时间戳,则此操作将无法正常工作。

不确定这会更快还是更慢!

SELECT Meter_Data.TimeStamp, Meter_Data.FwdHr, Meter_Data.W 
FROM Meter_Data 
INNER JOIN (SELECT MAX(TimeStamp) AS MaxTimestamp, MeterID, DeviceID,
CASE 
    WHEN TimeStamp Between 1356908255 AND 1356944255 THEN 1
    WHEN TimeStamp BETWEEN 1356911855 AND 1356947855 THEN 2
    WHEN TimeStamp BETWEEN 1356915455 AND 1356951455 THEN 3
    WHEN TimeStamp BETWEEN 1356919055 AND 1356955055 THEN 4
    WHEN TimeStamp BETWEEN 1356922655 AND 1356958655 THEN 5
END AS GroupNo
FROM Meter_Data 
WHERE (TimeStamp Between 1356908255 AND 1356944255 
OR TimeStamp BETWEEN 1356911855 AND 1356947855
OR TimeStamp BETWEEN 1356915455 AND 1356951455
OR TimeStamp BETWEEN 1356919055 AND 1356955055
OR TimeStamp BETWEEN 1356922655 AND 1356958655) 
AND MeterID = @meterID 
AND DeviceID = @deviceID 
GROUP BY MeterID, DeviceID, GroupNo) Sub1
ON Meter_Data.MeterID = Sub1.MeterID
AND Meter_Data.DeviceID = Sub1.DeviceID
AND Meter_Data.TimeStamp = Sub1.MaxTimestamp
ORDER BY Meter_Data.TimeStamp

关于asp.net - 限制mysql查询的记录数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16917022/

相关文章:

PHP/MySQL 在 TD 中输出数据

sql - mysql从备份部分恢复

asp.net - 我如何确定这个 javascript 来自哪里?

c# - 在不访问 UI 线程的情况下在 BackgroundWorker 中获取 "UnauthorizedAccessException"

asp.net - 如何在gridview中绑定(bind)数据表中的复选框值

c# - 单声道/Xamarin WebApi2?

php - 由于某人输入数据的方式很奇怪,无法生成准确的结果 (1 12 13)

mysql - 关于数据库管理系统的查询

sql - 数据库中的对象模型是什么?

sql - 如何提取去极端化的常见行为?