Mysql 如何将两个相似的独立结果组合成一个组合结果

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_

我正在构建一个版本系统,手机可以与 服务器。例如,手机在版本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个不同的触发器,因此它可以处理练习审核表

我对以下查询的当前响应

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_的值。