Mysql 如何将两个相似的独立结果组合成一个组合结果
我正在构建一个版本系统,手机可以与 服务器。例如,手机在版本1和服务器上运行 具有版本2,因此这意味着服务器将只返回 版本2的数据 我有以下表格:Mysql 如何将两个相似的独立结果组合成一个组合结果,mysql,sql,Mysql,Sql,我正在构建一个版本系统,手机可以与 服务器。例如,手机在版本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_
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个不同的触发器,因此它可以处理练习审核表
我对以下查询的当前响应
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"
}
注意!两者中名称相同的原因是因为在insert中
名称为NEW.name,更新中的名称为OLD.name,以便
跟踪历史数据
正如你所看到的,我有相同的练习,id_练习为6,它被插入到版本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,但他有一段时间没有与web同步。例如,web的版本为6,在第3版中添加了一个练习,在第6版中也进行了更新。因此,当手机请求数据时,它不会在同一事物上进行插入和更新。而是将其合并为一个事物,该事物的最新值将作为插入而不是更新
我可以用一些php代码来解决这个问题,但这会使问题变得复杂….不确定是什么决定了所执行操作的值,所以这部分只是猜测
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`
为什么不从练习表而不是审计表返回数据呢。这样,输出就是当前数据,您可以忽略更新/插入审核记录。只需使用审核表来确定用户在上次更新日期之后是否有更新。我将两者的输出混合在一起。再看一次我的问题,你就会明白为什么我需要将它们混合在一起。这是因为与手机同步,以便它可以跟踪用户在手机上有哪些数据,哪些数据没有。我教过如何使用GROUP通过而不是检查它是否大于1,并从中获取最后一个值,并放置insert而不是update。这是可以做到的,但我仍然不确定这是否是正确的方法,这就是为什么我在这里问@sloarthrasher。手机会收到json,其中包含需要执行的更改列表{insert:[…],update:[…]}这就是为什么我需要把它们混合在一起,因为它们可以工作,只需在版本上使用max并更改日期。可以在action_performed列上使用GROUP_CONCAT,并使用if来查看是否有“insert”值来确定输出中执行的action_的值。