PHP 和 MySQL, 如何在"Sparse"表中选择字段, 避免空值



我有一个包含数百列的表,但几乎所有列都为空。

该表中的每个'select'只返回一行,其中包含数百个字段。

使用PHP,我正在测试每个字段:

if (!empty($dataset["field"])) { ... }

出于优化的原因,如果我只选择有值的字段,我可以使用数组函数来知道每个字段的名称,并加快我的应用程序。

但是在MySQL 5.6中,我怎么能只选择有值的字段呢?

类似:

SELECT * FROM mytable ONLY fields_not_null();

该表记录一天中每分钟发生的事件数。记录集基本上是:

  1. 一个日期字段
  2. 60x24字段,以分钟为单位(1440字段)

将其更改为24个表(每小时)会降低性能,并且每个表中仍然有数十个空字段。

将其更改为一个带有date_time和boolean的记录集是性能最差的情况。

您可以尝试使用col IS NOT NULL: SELECT * FROM mytable WHERE column IS NOT NULL

对我来说,这表明你的MySQL数据库没有正确构建。

在PHP中最简单的方法是使用array_filter

例如:array_filter($row)将去掉所有空值(大致相当于false)。如果你只想摆脱null和空值,但留下0,那么你可以使用不同的回调,例如strlen,它将只返回至少有一个字符的值:

$filteredRow = array_filter($row, 'strlen');

现在$filteredRow将包含所有在field=>value数组中有值的字段。如果只想要字段名,可以使用array_keys:

$fields = array_keys($filteredRows);

在不知道您将如何处理这些数据的情况下,我无法指出一个单一的解决方案。这里有几个:

方案A:让应用程序代码处理所有的null

方案B:每非null分钟有一行。您可能需要使用GROUP_CONCAT()函数。

方案C:使用COALESCE()和/或IFNULL()功能

方案D:将非null值存储在关联数组(minute->value)中,序列化成JSON字符串,将JSON存储在TEXT字段中

不要使用24个表

不要尝试在一个表中有1440列;

最新更新