【问题标题】:sql join equals arraysql连接等于数组
【发布时间】:2016-03-08 12:12:53
【问题描述】:

我正在尝试构建产品及其选项的兼容性系统。 每个产品都存在多个版本,每个版本都有自己的规格。 每个选项也有自己的一套规范

表关系如下

Edition | - < editionspec > - | Specification
Option  | - < optionspec  > - | Specification

editionspec 是这样填写的

Edition | Specification
2       | 1
2       | 5
2       | 13
3       | 1
3       | 5
3       | 12

optionspec 是这样填充的

Option | Specification
1      | 1
1      | 5
1      | 12
2      | 1
2      | 5
2      | 12
3      | 12
8      | 1
8      | 5
8      | 13
9      | 13

在这种情况下,我搜索与第 3 版兼容的选项。

  • 选项 1 有效,因为 1、5 和 12 匹配
  • 选项 2 有效,因为 1、5 和 12 匹配
  • 选项 3 有效,因为 12 匹配且 1 和 5 为空
  • 选项 8 无效,因为 1 和 5 匹配,但 13 也不属于选项 8。

!一些背景信息,但我认为它与解决方案无关。

  • 1 在长度规范的组中(id:1)(组包含 id 的 1、2、3 和 4)
  • 5 在高度规范组中(id:2)(组包含 id 的 1、2、3、4 和 5)
  • 12 和 12 属于座椅规格组 (id: 3)(组包含 ids 12 和 13)

到目前为止我的查询:

SELECT `o`.* FROM `option` AS `o`
LEFT JOIN `optionspec` AS `os` ON o.id = os.option
LEFT JOIN `specification` AS `s` ON os.specification = s.id
LEFT JOIN `editionspec` AS `es` ON s.id = es.specification
LEFT JOIN `edition` AS `e` ON es.edition = e.id
LEFT JOIN `productcompatibility` AS `pc` ON o.id = pc.option
LEFT JOIN `product` AS `p` ON pc.product = p.id
LEFT JOIN `edition` AS `e2` ON p.id = e2.product
LEFT JOIN `optiongroup` AS `og` ON o.group = og.id
WHERE (e.id = 3 or e.id IS NULL)
    AND (e2.product = p.id or e2.product IS NULL)
    AND (og.id = 1)
GROUP BY `o`.`id`

我怎样才能使这个查询正确? 它现在检查是否可以找到任何规范。但它必须检查版本的每个规范组是否合格且正确或为空。

Click here for Database design

【问题讨论】:

    标签: php mysql arrays join


    【解决方案1】:

    我不确定,但这样的事情是否可行

    SELECT o.* FROM Options o, Edition e WHERE SELECT GROUP_CONCAT( o.Specification, ',') IN (GROUP_CONCAT(e.Specification, ','))
    

    也许您需要对 group_concats 进行子选择或对它们进行排序。但这实际上可以解决问题,因为 o 中的所有规范都必须在版本规范中。

    但正如我所说,我不确定

    【讨论】:

    • Jep 在对语法进行一些小的更改后就可以使用了。最终结果如下:WHERE (e.id = 3 or e.id IS NULL) AND (e2.product = p.id or e2.product IS NULL) AND (SELECT GROUP_CONCAT(os.specification, ',') = (GROUP_CONCAT(es.specification, ','))) AND (og.id = 1)
    猜你喜欢
    • 2017-02-27
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多