从MySql检索阵列数据的最佳方法是什么

从MySql检索阵列数据的最佳方法是什么,mysql,sql,database,mariadb,Mysql,Sql,Database,Mariadb,我将这样的对象/数据结构存储在MySql(实际上是一个MariaDb)数据库中: { idx: 7, a: "content A", b: "content B", c: ["entry c1", "entry c2", "entry c3"] } 为了存储它,我使用了两个表,非常类似于这个答案中描述的方法: i、 e 表1: +-----+---+---+ | idx | a | b | +-----+---+---+ 表2: +------------+-------+

我将这样的对象/数据结构存储在MySql(实际上是一个MariaDb)数据库中:

{
  idx: 7,
  a: "content A",
  b: "content B",
  c: ["entry c1", "entry c2", "entry c3"]
}
为了存储它,我使用了两个表,非常类似于这个答案中描述的方法:

i、 e

表1:

+-----+---+---+
| idx | a | b |
+-----+---+---+
表2:

+------------+-------+
| owning_obj | entry |
+------------+-------+
然后创建了一个视图,将它们连接在一起,所以我得到:

+-----+------------+------------+-----------+
| idx | a          | b          | c         |
+-----+------------+------------+-----------+
|   7 | content A1 | content B1 | entry c11 |
|   7 | content A1 | content B1 | entry c21 |
|   7 | content A1 | content B1 | entry c31 |
|   8 | content A2 | content B2 | entry c12 |
|   8 | content A2 | content B2 | entry c22 |
|   8 | content A2 | content B2 | entry c32 |
+-----+------------+------------+-----------+
我的问题是,我能让它回到我的对象形式的最好方式是什么?(例如,我想要一个idx在5到20之间的所有条目的上面指定的对象类型的数组)

我可以想出两种方法,但两种方法似乎都不是很有效

首先,我们可以将整个表发送回服务器,它可以制作一个hashmap,其中键是主键或其他一些唯一的索引,收集不同的c列,然后以这种方式重建,但这意味着它必须发送大量重复数据,并且在服务器上重建需要更多的内存和处理时间。如果我们有多个数组,或者数组中有数组,这种方法也不会很容易扩展

第二种方法是执行多个查询,过滤
表1
并获取所需的idx列表,然后针对每个idx,发送一个查询
表2
,其中
拥有的对象
=当前idx。这意味着发送更多的查询

这两种选择都不是很好,所以我想知道是否有更好的方法。目前,我认为它可以利用
JSON\u OBJECT()
,但我不确定如何使用

这似乎是一种常见的情况,但我似乎找不到确切的措辞来寻找答案


PS:与MySql/MariaDb接口的服务器是用Rust编写的,尽管你可以使用
GROUP\u CONCAT
将所有
c
值组合成逗号分隔的字符串,但不要认为这与这个问题有关

SELECT t1.idx, t1.a, t1.b, GROUP_CONCAT(entry) AS c
FROM table1 AS t1
LEFT JOIN table2 AS t2 ON t1.idx = t2.owning_obj
GROUP BY t1.idx
然后在PHP中分解字符串:

$result_array = [];
while ($row = $result->fetch_assoc()) {
    $row['c'] = explode(',', $row['c']);
    $result_array[] = $row;
}
但是,如果条目可能较长,请确保增加
group\u concat\u max\u len


如果您使用的是MySQL 8.0,那么还可以使用
JSON\u ARRAYAGG()
。这将创建一个包含
条目
值的JSON数组,您可以使用
JSON\u decode()
将其转换为PHP数组。这稍微安全一点,因为如果任何值包含逗号,则
GROUP\u CONCAT()
将出错。您可以更改分隔符,但需要一个永远不会出现在任何值中的分隔符。不幸的是,这不在MariaDB中。

如果是PHP,我会做一些类似于
从视图组中按idx选择idx、a、b、GROUP_CONCAT(c)
,然后
$obj=$result->fetch_object()$obj->c=爆炸($obj->c)
@Barmar我在问题中已经解决了重复问题,我在问是否有比在使用hashmap分离大量重复数据之前检索大量重复数据更好的方法。