sql join等于数组

时间:2016-03-08 12:12:54

标签: php mysql arrays join

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

表关系如下

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和&amp; 12场比赛
  • 选项2有效,因为1,5和&amp; 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&amp; 5)
  • 12和12属于座位规格组(id:3)(组包含ID 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

1 个答案:

答案 0 :(得分:0)

我不确定,但这样的事情可以起作用

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

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

但正如我所说,我不确定