-1

如何将 php 数组存储在 mysql 中然后过滤它们?

例如:

$array = array("a"=>13,"b"=>15,"c"=>17);

$mysql_val = json_encode($array);

mysql_query("INSERT INTO bla (`myfield`) VALUES('".$mysql_val."')"); 
             ^- i store data in this way

当我执行这个查询时,我该如何过滤、排序等呢?例如,如何选择 b 大于 10 的行?

4

7 回答 7

2

首先,您错误地使用了数据库,这就是您无法过滤排序等的原因...

您应该为 each 有一列a, b, c,然后您可以使用SELECT * FROM bla ORDER BY a DESC或可能对您更好,拥有一个映射键 => 值的表。

通过将数据存储为字符串MySQL无法访问它,因此您无法对其进行排序。

如果您不知道键(字段)名称,则存储此数据的正确(标准化)方法如下所示:

bla
id | name
-- | ----
2  | james

blaDecorator or blaColumns
id | blaId | field | value
1  | 2     | a     | 13
2  | 2     | b     | 15
3  | 2     | c     | 17

如果您必须像这样保留您的数据(我看不出为什么),那么您需要将其SELECT * FROM bla读入 PHPArray并使用 PHP 进行所有排序

这是学习数据库规范化的资源:http ://www.phlonx.com/resources/nf3/

于 2012-09-13T08:27:39.073 回答
2

这就是数据库规范化的原因,特别是第一范式,避免重复组。通过以原子方式存储数据(数据不能分解成更小的部分),您将能够对数据执行操作。

于 2012-09-13T08:29:02.847 回答
1

不,JSON 数据对于 MySQL 来说只是一段文本,因此除了运行通常的文本函数之外它无法处理它。

您必须从数据库和文本中读取它们并在 PHP 级别转换为 JSON,然后在您的应用程序中进行排序或过滤。

如果这对您很重要,请考虑使用 NoSQL 数据库,其中许多是原生基于 JSON 的。

于 2012-09-13T08:27:21.243 回答
1

你没有。

这是一种在数据库中存储数据的糟糕方式。将数据存储为列,并将数据库用作数据库。

但是,如果必须,请使用 PostgeSQL。见:http ://blog.redfin.com/devblog/2012/03/json_in_postgres.html

最新版本的 PostgeSQL 具有查询 json 字符串中的数据并对其进行连接的功能。

于 2012-09-13T08:28:15.487 回答
1

如果您想将数据存储为 json,也许您应该考虑使用像MongoDB这样的文档数据库。有了它,您将能够在您的 json 数据中搜索、过滤等

于 2012-09-13T08:31:03.523 回答
0

虽然所有响应者都质疑数据库的使用。在实际使用案例中这是合适的。我正面临这样的问题,这是我的解决方案:

function prepareArrayToSave($array) {
    return (implode("", array_map("numberPad", $array)));
}

function numberPad($i) {
    return sprintf("%03d", $i);
}

保存在字段中Decimal(64)

限制是:

  1. 数组中的每个值不能大于 999;
  2. 任何数组的值不得超过 21 个。
于 2013-04-17T00:22:21.213 回答
0

不要这样存储数据!制作 3 个字段并将数据存储在这些字段中。

例子:

$array = array("a"=>13,"b"=>15,"c"=>17);
$fields = array_keys($array);

mysql_query(
"INSERT INTO bla ( " . explode(',', $fields) . ") 
VALUES('" . explode(',' $array) . "')"); 
于 2012-09-13T08:32:22.850 回答