2017-12-06 3 views
0

정보에 따라 다른 테이블로 sqlite 데이터베이스로 데이터를 보내는 웹 응용 프로그램이 있습니다. Cownumber와 TS [timestamp]를 기반으로 여러 테이블을 병합하는보기를 만들고 싶습니다. (내 테이블에는 업데이트가 없으므로 동일한 cownumber를 변경하면 전체 레코드가 새 타임 스탬프가있는 새 항목으로 보내집니다). 아약스 호출이 TS 정확히까지 동기화하지 않도록 일반적으로 그들이 연결 여기ID와 타임 스탬프에서 다중 테이블을 조인하는 뷰 만들기

에 따라 해제 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; 

을 쓴 쿼리

를 썼다 돌아 오기 한 모든 상관 기록이 서로의 몇 초 이내에했다으로 cownumber (941)에 대해 하나 개의 행이 될 것입니다 경우

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

하였다. 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

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 귀하의 방법을 시도하고 작동한다면 다시 연락 드리겠습니다. . 감사 –