我有一个表,其中包含200个不同的传感器和相应的传感器值。我想创建一个查询,其中不同的传感器值在不同的列中。
我已经尝试过加入并合并它并没有达到预期的效果。
从measuredValue中选择*; //简化
| sensorId |值|
| 6 | 110 |
| 6 | 120 |
| 6 | 180 |
| 8 | 250 |
| 8 | 280 |
| 8 | 290 |
目标
|传感器6 | sensor8 |
| 110 | 250 |
| 120 | 280 |
| 180 | 290 |
PS:传感器的行始终相等。表格中还有时间戳列。我认为放在这里没关系。
答案 0 :(得分:0)
您可以加入时间戳。假设您的传感器每小时节省一次测量。你可以
SELECT
DATE_FORMAT(sensor6.timestamp, '%Y-%m-%d-%H'),
sensor6.value as sensor6,
sensor8.value as sensor8
FROM
sensorMeasures sensor6
JOIN
sensorMeasures sensor8 ON
DATE_FORMAT(sensor6.timestamp, '%Y-%m-%d-%H') =
DATE_FORMAT(sensor8.timestamp, '%Y-%m-%d-%H')
WHERE
sensor6.sensorId = 6
AND sensor8.sensorId = 8
通过加入时间戳,您将获得一张包含来自同一日期/时间的所有传感器数据对的线表。 这两个where子句只是选择右行(第一个传感器数据来自第6个传感器,第二个传感器数据来自第8个传感器。
当然,您可以更改DATE_FORMAT格式以匹配该数据库中存储数据的频率。
答案 1 :(得分:0)
CREATE TABLE table1
(`sensorId` int, `Value` int)
;
INSERT INTO table1
(`sensorId`, `Value`)
VALUES
(6, 110),
(6, 120),
(6, 180),
(8, 250),
(8, 280),
(8, 290),
(9, 250),
(9, 280),
(9, 290)
;
然后我用这个查询
Select Value6,Value8,Value9
From
(SELECT Value as Value6,
@curRank := @curRank + 1 AS rank
FROM table1 t1, (SELECT @curRank := 0) r
Where sensorId =6
ORDER BY Value) t1
inner join
(SELECT Value as Value8,
@curRank2 := @curRank2 + 1 AS rank
FROM table1 t2, (SELECT @curRank2 := 0) r
Where sensorId =8
ORDER BY Value) t2 on t1.rank = t2.rank
inner join
(SELECT Value as Value9,
@curRank3 := @curRank3 + 1 AS rank
FROM table1 t2, (SELECT @curRank3 := 0) r
Where sensorId =9
ORDER BY Value) t3 on t1.rank = t3.rank;
结果
Value6 Value8 Value9
110 250 250
120 280 280
180 290 290
这取决于每个sensorId总是有相同数量的行。 这也可以在存储过程中使用,就像我在这里所做的一样 how to make row values to column dynamically in mysql 但是在这里,您只需要光标从1到200的循环即可。
说实话,我会选择一个*从table1中按SensorId,Value排序,并在jquer.success中使用结果。