我有一个Web应用程序,根据信息将数据发送到我的sqlite数据库到不同的表中。我想根据cownumber和TS [timestamp]制作一个将多个表合并在一起的视图(我的表没有更新,因此对同一个cownumber的更改会将完整记录作为带有新时间戳的新条目发送)。 ajax调用是逐表进行的,因此TS不会完全同步,通常它们可以在5-20秒内关闭,具体取决于连接
以下是三个表格的示例
+----master_animal-----+
+----------------------------------------------------+
| cownumber | height | weight | ts |
+-----------+----------+--------+--------------------+
| 1 | 150 | ... | 2017-12-01 12:28:00|
| 2 | 170 | ... | 2017-12-03 17:16:00|
| 3 | 60 | ... | 2017-12-03 08:09:00|
| 4 | 109 | ... | 2017-12-04 23:23:00|
+----animal_inventory-----+
+-------------------------------------------------------------+
| cownumber | brandlocation| dateacquired| ts |
+-----------+--------------+-------------+--------------------+
| 1 | ... | ... | 2017-12-01 12:28:50|
| 2 | ... | ... | 2017-12-03 17:16:30|
| 3 | ... | ... | 2017-12-03 08:09:12|
| 4 | ... | ... | 2017-12-04 23:23:23|
+----experiment-----+
+-------------------------------------------------------------+
| cownumber | ageatwean | birthweight | ts |
+-----------+--------------+-------------+--------------------+
| 1 | ... | ... | 2017-12-01 12:28:20|
| 2 | ... | ... | 2017-12-03 17:16:41|
| 3 | ... | ... | 2017-12-03 08:09:24|
| 4 | ... | ... | 2017-12-04 23:23:11|
我写的视图
CREATE VIEW testing
AS SELECT a.height,a.weight,a.cownumber,
b.brandlocation,b.dateacquired,
c.ageatwean,c.birthweight
FROM master_animal a, animal_inventory b, experiment c
WHERE a.cownumber=b.cownumber
AND ROUND(a.ts/10000) = ROUND(b.ts/10000)
AND a.cownumber=c.cownumber
AND ROUND(a.ts/10000) = ROUND(c.ts/10000);
我写的查询
Select * from testing where cownumber = 1;
我希望得到的是
+----testing-----+
+----------------------------------------------------+
| cownumber | height | weight | brandlocation| dateacquired | ageatwean |birthweight |
+-----------+--------+--------+--------------+--------------+-----------+------------+
| 941 | 0 | ... | ... | ... | ... | .. |
只要所有相关记录在彼此的几秒内,cownumber 941就会有一行。我不确定我是否需要除以10000或更小。相同的记录应该相隔不超过50秒。任何超过50秒的东西都应被视为新记录。
当我测试这个cownumber只有一个记录时,它可以正常工作。但是我可以说我从每个表中更改了一些信息。我提供了一个新的高度,一个新的品牌定位。
而不是获得两行。第一行是初始数据条目,第二行显示具有更改值的相同cownumber,我返回8行并进行部分更改。
height|weight|cownumber|brandlocation|dateacquired|ageatwean|birthweight|
0.0|0.0|941|0|0|0.0|0
0.0|0.0|941|0|0|0.0|0
0.0|0.0|941|Left Hip|0|0.0|0
0.0|0.0|941|Left Hip|0|0.0|0
50.0|0.0|941|0|0|0.0|0
50.0|0.0|941|0|0|0.0|0
50.0|0.0|941|Left Hip|0|0.0|0
50.0|0.0|941|Left Hip|0|0.0|0
我认为问题出在我的where子句中,但我不确定如何解决它
答案 0 :(得分:0)
时间戳存储为字符串。当您尝试划分它时,数据库会尝试将其转换为数字,从而生成2017
。所以所有时间戳最终都是一样的。
划分无法确定距离;尽管它们彼此接近,但值9999和10000将最终不同。 (并且整数除法会产生整数结果,因此ROUND()
无效。)
要计算距离,请先将时间戳转换为秒数,然后使用abs():
SELECT ...
FROM master_animal m
JOIN animal_inventory i ON m.cownumber = i.cownumber
AND abs(strftime('%s', m.ts) - strftime('%s', i.ts)) <= 50
JOIN experiment e ON m.cownumber = e.cownumber
AND abs(strftime('%s', m.ts) - strftime('%s', e.ts)) <= 50;