2017-06-22 33 views
0

我建立一個版本系統中的手機將能夠與 同步的第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代碼解決它,但它會自我複雜出來....

+0

爲什麼不從執行表中而不是審計表中返回數據。這樣輸出就是當前數據,你可以忽略更新/插入審計記錄。只需使用審計表來確定用戶的上次更新日期之後是否有更新。 –

+0

我在兩者之間混合輸出。再次閱讀我的問題,你會明白爲什麼我需要混合它們。它是因爲與手機同步,因此它可以跟蹤用戶在手機上的哪些數據以及哪些數據不。 – DaAmidza

+0

我教過的使用GROUP BY ...比檢查它是否大於1並從中取出最後一個值並放置插入而不是update.That它可以完成但仍然不確定它是否正確這就是爲什麼我在這裏問@sloanthrasher。 – DaAmidza

回答

1

不知道什麼決定了價值action_performed,使部分是猜測。

SELECT IF('insert' IN GROUP_CONCAT(ea.`action_peformed`),'insert','update') as `action_performed`, 
    MAX(ea.`version`) as `version`, 
    MAX(ea.`change_date`) as `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 
GROUP BY e.`id_exercise` 
相關問題