【问题标题】:MySQL 5.7 (PHP) Compare two json arrays and get dfferenceMySQL 5.7 (PHP) 比较两个 json 数组并获得差异
【发布时间】:2020-08-23 06:41:05
【问题描述】:

我有表films 与列id | array_of_img

array_of_img 列包含 JSON 数组,例如 ["1","2","3"]

我还有一个会话变量数组$session_var = [1,2],在json_encode 之后变成["1","2"]。

所以我的目标是获得单个随机整数值,它不在$session_var 中,而是在array_of_img 列中的films 行之一中。

在上面的例子中,结果必须是3

可能的逻辑:

  • 合并两个 json 并删除重复项
  • 以某种方式获得比较两个 json 的 UNIQUE 元素

我浏览了这些功能,但不明白如何在我的情况下使用它们:

  • JSON_CONTAINS
  • JSON_OVERLAPS(MySQL 版本> 5.7)
  • JSON_KEYS
  • JSON_MERGE_PRESERVE
  • JSON_MERGE_PATCH

查看语法的一些代码

$session_var = json_encode($session_var);
$query = "SELECT * FROM films WHERE ORDER BY RAND() LIMIT 1";

非常感谢您的帮助!

【问题讨论】:

  • 如果没有 MySQL 8+,这在 PHP 中可能更容易做到。
  • @Nick 非常感谢。我想我已经做到了你的意思。
  • 很抱歉,我不能提供更多帮助。如果您确实升级到 MySQL 8,您可以在两个 JSON 值上使用JSON_TABLE,并使用反连接来获取两者都不存在的值。

标签: php mysql arrays json


【解决方案1】:

感谢Nick 的建议,我做了一些解决方法并做到了。

require_once 'connection.php';
$link = mysqli_connect($host, $user, $password, $database) or die("Error_connect_1 " . mysqli_error($link));

session_start();
$session_var = $_SESSION["arr_of_img"] ? $_SESSION["arr_of_img"] : [];

//count possible variants [summary of json_length_field]
$query = "SELECT SUM(JSON_LENGTH(arr_of_img)) AS summary FROM films WHERE show_this IS NULL";
$result = mysqli_query($link, $query) or die("Error_connect_2 " . mysqli_error($link));
$result = mysqli_fetch_array($result, MYSQLI_ASSOC);
$summary = $result['summary'];

//get the whole table and random it
$query = "SELECT * FROM films WHERE show_this IS NULL ORDER BY RAND()";
$result = mysqli_query($link, $query) or die("Error_connect_2 " . mysqli_error($link));
$table = mysqli_fetch_all($result, MYSQLI_ASSOC);

//walk through the table and find array of different values
foreach ($table as $row) {
    $arr_of_img_db = $row['arr_of_img'];
    $arr_of_img_db = json_decode($arr_of_img_db);
    $result = array_diff($arr_of_img_db, $session_var);
    if ($result) break;
}

//get single random value and get image by this value
if ($result) {
    $arr_of_img = $result;
    $img = array_rand($arr_of_img, 1);
    $img = $arr_of_img[$img];

    $query2 = "SELECT id, src as img,show_this  FROM img WHERE id LIKE '" . $img . "' AND show_this IS NULL LIMIT 1";
    $result2 = mysqli_query($link, $query2) or die("Error_connect_2 " . mysqli_error($link));
    $result = mysqli_fetch_array($result2, MYSQLI_ASSOC);
}

echo json_encode($result);
mysqli_close($link);

【讨论】:

    猜你喜欢
    • 2013-04-27
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多