php - 使用 JSON 数据作为输入,基于每行的两个约束选择数据

标签 php mysql

我有一个数据库表,其中保留一列用于条目的版本控制。客户端应用程序应该能够使用其当前版本和 ID 查询服务器,并且服务器以每个条目具有更高版本的行进行响应。我不是 MySQL 方面的专家,所以我不知道如何实现这一点。我尝试过各种各样的事情,但目前还远远没有生产出任何有效的东西。

示例:

服务器数据:

mysql> SELECT id, version FROM my_data;
+-----+---------+
| id  | version |
+-----+---------+
|   1 |       0 |
|   2 |       1 |
|   3 |       2 | <-- The JSON data below has lower version, so this row should be selected.
|   4 |       0 |
|   5 |       1 |
|   6 |       0 |
|   7 |       1 | <-- The JSON data below has lower version, so this row should be selected.
|   8 |       1 |
|   9 |       4 | <-- The JSON data below has lower version, so this row should be selected.
|  10 |       1 |
+-----+---------+
10 rows in set (0.00 sec)

客户端发送的数据:

然后,客户端使用 JSON 格式的以下数据(或其他格式的数据,但我的例子中使用的是 JSON)来查询服务器。服务器端是 php,我需要解析此 JSON 数据并以某种方式将其包含在查询中。 这是客户端当前包含的数据。

{
    "my_data": [
        {
            "id": 1,
            "version": 0
        },
        {
            "id": 2,
            "version": 1
        },
        {
            "id": 3,
            "version": 0
        },
        {
            "id": 4,
            "version": 0
        },
        {
            "id": 5,
            "version": 1
        },
        {
            "id": 6,
            "version": 0
        },
        {
            "id": 7,
            "version": 0
        },
        {
            "id": 8,
            "version": 1
        },
        {
            "id": 9,
            "version": 2
        },
        {
            "id": 10,
            "version": 1
        }
    ]
}

在此示例中,我希望 MySQL 查询返回 3 行;即id 3、7、9这3行,因为客户端版本低于服务器版本,所以需要获取一些数据进行更新。如何通过一个简单的查询来实现这一目标?我不想为每一行运行一个查询,即使这是可能的。

示例数据的期望结果:

结果数据应该是服务器端数据库中的版本大于JSON数据集中对应id的数据的行。

mysql> <INSERT PROPER QUERY HERE>;
+-----+---------+
| id  | version |
+-----+---------+
|   3 |       2 |
|   7 |       1 |
|   9 |       4 |
+-----+---------+
3 rows in set (0.00 sec)

最佳答案

注意:没有使用PDO,只是查询字符串生成,可以轻松切换

要检查每个版本,您可以对每个 id 执行 OR 语句,但首先检查 json 不为空

$jsonData = json_decode($inputJson, true);
$jsonData = $jsonData['my_data'];
$string = 'select * from my_data where';
foreach($jsonData as $data) {
    $conditions[] = '(id='.$data['id'].' and version>'.$data['version'].')';
}
$string .=implode('or', $conditions);

结果:

select * from my_data where (id=1 and version>0) or (id=2 and version>0)

关于php - 使用 JSON 数据作为输入,基于每行的两个约束选择数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33710798/

相关文章:

MYSQL:根据其他列分组的计数设置列值

php - 我想删除 Framesets 和 Iframes 并且仍然有独立的页面刷新 PHP 数据而不刷新整个页面

php - 将 1-5 位数字转换为字母数字 5 位数字

php - wordpress前后内容添加div

php - 错误 #1136 但上传备份的 WordPress 数据库时,列似乎与值匹配

php - 给定用户名时,根据分数从无序的 MySql 数据库中获取排名

php - 如何获取子网中的每个IP地址?

php - 使用 PDO 在 mysql 表中搜索字符 %

javascript - 将结果存储在变量中,就像 Java 在 TypeScript 中一样

左连接后MYSQL求和不同值