我建立一個版本系統中的手機將能夠與 同步的第1版手機的運行速度的服務器。例如,服務器 有第2版,所以這意味着服務器將只返回 數據版本2如何合併兩個不同的結果是相似的到一個綜合作用的結果
我有以下表格:
CREATE TABLE `exercise` (
`id_exercise` int(11) NOT NULL,
`name` varchar(45) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `exercise_audit` (
`id_exercise_audit` int(11) NOT NULL,
`name` varchar(45) NOT NULL COMMENT 'The name will take the new value if inserted ,or the old value if edited.And the latest value if deleted.',
`action_peformed` varchar(45) NOT NULL,
`version` int(11) NOT NULL,
`reference_id` int(11) NOT NULL,
`change_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `version` (
`id_version` int(11) NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`state` enum('C','P') NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
鍛鍊表有3個不同的觸發器,以便它可以處理exercise_audit表。
電流響應,我有使用以下查詢
SELECT ea.action_peformed,
ea.version,
ea.change_date,
e.name,
e.id_exercise
FROM exercise_audit AS ea
LEFT JOIN exercise AS e
ON e.id_exercise = ea.reference_id
WHERE version > :version
看起來像這樣:
[
{
"action_peformed": "insert",
"version": "1",
"change_date": "2017-06-22 16:42:03",
"audit_name": "Push Ups",
"current_name": "Push Ups",
"id_exercise": "1"
},
{
"action_peformed": "insert",
"version": "1",
"change_date": "2017-06-22 16:42:06",
"audit_name": "Squat",
"current_name": "Squat",
"id_exercise": "2"
},
{
"action_peformed": "insert",
"version": "1",
"change_date": "2017-06-22 16:42:09",
"audit_name": "Chin Ups",
"current_name": "Chin Ups",
"id_exercise": "3"
},
{
"action_peformed": "insert",
"version": "2",
"change_date": "2017-06-22 16:44:25",
"audit_name": "Pull Ups",
"current_name": "Pull Ups",
"id_exercise": "4"
},
{
"action_peformed": "insert",
"version": "2",
"change_date": "2017-06-22 16:45:08",
"audit_name": "Sit Up",
"current_name": "Sit Up",
"id_exercise": "5"
},
{
"action_peformed": "insert",
"version": "2",
"change_date": "2017-06-22 16:45:28",
"audit_name": "Pike Push Up",
"current_name": "Pike Push Ups",
"id_exercise": "6"
},
{
"action_peformed": "update",
"version": "3",
"change_date": "2017-06-22 16:47:28",
"audit_name": "Pike Push Up",
"current_name": "Pike Push Ups",
"id_exercise": "6"
}
]
有問題的部分是這一個:
{
"action_peformed": "insert",
"version": "2",
"change_date": "2017-06-22 16:45:28",
"audit_name": "Pike Push Up",
"current_name": "Pike Push Ups",
"id_exercise": "6"
},
{
"action_peformed": "update",
"version": "3",
"change_date": "2017-06-22 16:47:28",
"audit_name": "Pike Push Up",
"current_name": "Pike Push Ups",
"id_exercise": "6"
}
注意!兩者名稱相同的原因是因爲在插入 的名稱是NEW.name,並且在更新中名稱是OLD.name,因此我可以 保留歷史數據的跟蹤。
正如你可以看到我有同樣的運動與6 id_exercise它插在2版和第3版。
更新,而且我有問題是如何將它們在SQL結合該它是一體的。
例如,要實現以下目標:
{
"action_peformed": "insert",
"version": "3",
"change_date": "2017-06-22 16:47:28",
"audit_name": "Pike Push Up",
"current_name": "Pike Push Ups",
"id_exercise": "6"
}
,它結合了更新和插入,以便它使用最近更新的數據作爲插入數據。
之所以會出現這種情況,是因爲用戶在移動設備上擁有版本1,並且他沒有與網絡同步一段時間。例如,網絡版本爲6,並且練習已添加版本3,它也在版本6中更新。所以當手機請求數據時,它不會插入和更新相同的東西。而是將它合併成一個具有插入的最新值的東西,而不是更新。
我可以用一些PHP代碼解決它,但它會自我複雜出來....
爲什麼不從執行表中而不是審計表中返回數據。這樣輸出就是當前數據,你可以忽略更新/插入審計記錄。只需使用審計表來確定用戶的上次更新日期之後是否有更新。 –
我在兩者之間混合輸出。再次閱讀我的問題,你會明白爲什麼我需要混合它們。它是因爲與手機同步,因此它可以跟蹤用戶在手機上的哪些數據以及哪些數據不。 – DaAmidza
我教過的使用GROUP BY ...比檢查它是否大於1並從中取出最後一個值並放置插入而不是update.That它可以完成但仍然不確定它是否正確這就是爲什麼我在這裏問@sloanthrasher。 – DaAmidza