在MYSQL中存储数组?

时间:2016-08-04 12:53:10

标签: php mysql sql arrays pdo

首先,我知道有很多帖子关于“如何在MySql数据库中存储数组?”是的,我经历了其中的大多数,这些解决方案似乎只是创建单独的表并加入它们。我不认为是这种情况。至少我无法想出任何东西。

好的,所以我有以下表格:

  • 产物: | ID |名称|链路| color_list | size_list | cloth_type |
  • size_indicators | ID |名称|链路|
  • color_indicator | ID |名称|链路|
  • cloth_indicator | ID |名称|链路|

我想做什么: 在产品页面上,我有一个带有cloth_type,颜色,大小的过滤器。 Same goes for the colors 这些是复选框。

我希望能够检查这些框并按“过滤器”按钮或任何其他按钮来过滤查询。 我没有发布已经存在的查询,因为他们正在加入与其他函数相关的其他表。

我在想也许有可能有这样的事情: size_indicators表有字符串/数组:1,4,3(类似于其他表),因此数组将是$size_array([0] => 1, [1] => 4, [2] => 3),查询将如下: $stmt = $pdo->prepare("SELECT products.p_id, products.name, products.size_list, FROM products WHERE size_list = $size_array;

我知道这个查询不起作用,这只是一个想法,如果我能以某种方式将数组放入size_list列的产品表中,然后将其与所选大小的数组进行比较。

帮助我大致了解如何为一个列表(size_list)执行此操作,我将完成剩下的工作。我一直在寻找这个,但真的找不到任何有用的东西。另外,我做错了什么,有人知道我应该如何构建我的表并做到这一点。

3 个答案:

答案 0 :(得分:1)

您可以将FIND_IN_SET用于这类查询

SELECT products.p_id, products.name, products.size_list FROM products WHERE FIND_IN_SET(size_list,'1,4,3'); 

答案 1 :(得分:1)

您可以使用元数据表来存储链接到Wordpress中的单个行的不同信息:https://codex.wordpress.org/Database_Description#Table:_wp_usermeta

您只需使用产品ID的属性(键)名称即可获得ID为4的产品的所有变体。

获取产品所有颜色的示例: SQL SELECT ci.`name` AS color FROM `product_meta` AS pm JOIN `color_indicator` AS ci ON ci.`id` = pm.`value` WHERE pm.`key` LIKE 'color' AND pm.`id_product` = 4;

如果您想找到可以使用的所有红色产品: SQL SELECT * FROM `product` AS p WHERE p.`id` IN ( SELECT pm.`id_product` FROM `product_meta` AS pm JOIN `color_indicator` AS ci ON ci.`id` = pm.`value` WHERE pm.`key` LIKE `color` AND ci.`name` LIKE 'red' );

答案 2 :(得分:1)

一个包含单列并使用该列作为KEY(该表的自然键)的表是一个数组。

解决方案是在产品表和支持表之间建立多对多关系。支持表是仅包含一列或两列的表(例如, id name 或仅 name )。重复尺寸布料

的模式

产品 ID ,名称,说明

类型 Id

ProductTypes ProductId TypeId

每个选中的值都是 ProductTypes 中的条目,并告知产品具有该特征。表格类型用于显示网页中所有可能的过滤器值,供用户过滤。一旦用户选择了值并按下了#34; Filter",就必须构建一个类似下面的SQL查询。

查询可能会根据您的业务逻辑而改变。例如,如果要显示具有任何所选类型/尺寸/布料或所有选中值的产品。在这两种情况下,SQL查询都会非常复杂。这是一个粗略的,未经测试和过于简化的例子:

$stmt = "SELECT * FROM Products p " +
            "INNER JOIN ProductTypes pt ON p.Id = pt.ProductId " +
        "WHERE pt.TypeId IN (" + $sqlEscapedCommaSeparatedTypeList + ")";

正如我所说,这是未经测试的PHP,查询有点粗糙。对于大型产品来说,这将是缓慢的。最重要的是不要忘记逃避输入以避免SQL注入。

我建议创建一个存储过程并使用一个填充了用户选择的临时表并加入它以在某种程度上优化它。

正如我所说,这不是一个简单的查询,你的商业案例可能不是我所假设的。由于您在三个支持表上查询,因此存储过程将是您的最佳解决方案。如果您希望保持简单并避免单个庞然大物不可读的SQL查询,则尤其如此。