【问题标题】:Store array in MYSQL? [closed]在MYSQL中存储数组? [关闭]
【发布时间】:2016-12-10 14:38:23
【问题描述】:

首先我知道有很多关于“如何在 MySql 数据库中存储数组?”的帖子。是的,我经历了其中的大部分,这些解决方案似乎只是创建单独的表并将它们连接起来。我认为情况并非如此。至少我什么都想不出来。

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

  • 产品: |id|name|link|color_list|size_list|cloth_type|
  • size_indicators |id|名称|链接|
  • color_indicator |id|名称|链接|
  • cloth_indicator |id|名称|链接|

我想做什么: 在产品页面上,我有一个带有布料类型、颜色、尺寸的过滤器。 这些是复选框。

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

我在想也许有可能有这样的东西: 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)执行此操作,其余的我会做。我一直在寻找这个,但真的找不到任何有用的东西。另外,我做错了一切,有人有其他想法我应该如何构建我的表格并做到这一点。

【问题讨论】:

  • "..solution 似乎只是创建单独的表并加入它们" 这是正确的。了解规范化。
  • 如果您不进行规范化,那么您的系统就不可能超越某些自制项目。尝试您提出的建议的原因是零,而您在网上找不到任何帮助的原因是因为没有人会写一篇提倡这种糟糕做法的博客。
  • 那么 MonkeyZeus,你有什么建议如何规范我的数据库吗?因为我需要的是尺寸、颜色、类型的动态数量。对于每个产品。
  • Junction Tables 的无耻插件。如果你不这样做,我就不想站在你的立场上。

标签: php mysql sql arrays pdo


【解决方案1】:

您可以将 FIND_IN_SET 用于此类查询

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

【讨论】:

  • 非常好,谢谢!您和 Dege 的建议都有效。
【解决方案2】:

您可以使用元数据表来存储链接到表中单行的不同信息,例如 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' );

【讨论】:

  • 用您当前的颜色表编辑
  • 谢谢!这将是我将使用的方法。
【解决方案3】:

具有单列并将该列用作 KEY(该表的自然键)的表是一个数组。

解决方案是在您的产品表和支持表之间建立多对多关系。支持表是只包含一或两列的表(例如idname 或仅name)。重复 SizeCloth 的模式:

产品Id、名称、描述

类型Id

ProductTypesProductIdTypeId

每个选中的值都是 ProductTypes 中的一个条目,表明产品具有该特征。 Types 表用于在您的网页中显示所有可能的过滤器值,以供用户过滤。一旦用户选择了值并按下“过滤器”,您就必须构建一个如下所示的 SQL 查询。

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

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

正如我所说,这是未经测试的 PHP,查询有点粗糙。对于庞大的产品集,它会很慢。最重要的是不要忘记转义输入以避免 SQL 注入。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-21
    • 2011-03-02
    • 1970-01-01
    • 2015-04-21
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多