我有一个数据库表,其中保留一列用于条目的版本控制。客户端应用程序应该能够使用其当前版本和 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/