2017-12-06 5 views
0

情報に応じて、sqliteデータベースに異なるテーブルにデータを送信するWebアプリケーションがあります。 cownumberとTS [timestamp]に基づいて複数のテーブルをまとめて表示するようにしたいと思います(テーブルには更新がないので、同じcownumberを変更すると新しいタイムスタンプの新しいエントリとしてフルレコードが送信されます)。 AJAX呼び出しは、TSが正確に一般的にアップ同期しませんので、彼らはここで接続IDと複数のテーブルを結合するビューを作成する丸めを必要とする

に応じて、オフ5-20秒とすることができ、テーブルでテーブルを作っている3つのテーブル

+----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; 

を書いたクエリを書きました戻って取得することがある限り、すべての相関レコードが互いに数秒以内であったとしてcownumber 941のために1行が存在します

+----testing-----+ 
+----------------------------------------------------+ 
| cownumber | height | weight | brandlocation| dateacquired | ageatwean |birthweight | 
+-----------+--------+--------+--------------+--------------+-----------+------------+ 
| 941  | 0  | ... |  ... |  ...  |  ... | ..  | 

ました。私が10000以下で分割する必要があるかどうかは確かではありません。同じレコードは、互いに50秒以上離れてはいけません。 50秒以上離れたものは新しい記録とみなすべきです。

私がこのcownumberのレコードが1つしかない場所でこれをテストすると、正常に動作します。しかし、私は各テーブルからいくつかの情報を変更すると言うことができます。私は新しい高さ、新しいブランドロケーションを提供します。

2行を取得する代わりに。最初の行は最初のデータエントリであり、2行目は変更された値を持つ同じ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

Iはあなたの牛に繰り返しは見られません。インサートの更新はどこにありますか? –

+0

挿入はクライアント側のajax POSTによって行われます –

答えて

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; 
+0

なぜ文字列ですか? OPはタイムスタンプです。 –

+1

私が作成したときにSQLでtimestamp変数を使用しました。しかし、これを見て、私はあなたが言っていることがより意味をなさないと思うようになります。とにかにSQLiteは文字列としてそれらを保存します。 https://stackoverflow.com/questions/16596126/sqlite-creating-a-database-with-a-timestamp-column-and-adding-a-value-in私はあなたの方法を試して、あなたに戻ってきます。 。ありがとう –

関連する問題