我正在尝试构建产品及其选项的兼容性系统。 每个产品都有多个版本,每个版本都有自己的规格。 每个选项也有自己的一套规范
表关系如下
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兼容的选项。
!一些背景信息,但我相信它与解决方案无关。
到目前为止我的查询:
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`
如何使此查询正确? 它现在检查它是否可以找到任何规格。但它必须检查版本的每个规范组是否合格且正确或为空。
答案 0 :(得分:0)
我不确定,但这样的事情可以起作用
SELECT o.* FROM Options o, Edition e WHERE SELECT GROUP_CONCAT( o.Specification, ',') IN (GROUP_CONCAT(e.Specification, ','))
也许你需要为group_concats进行subselect或对它们进行排序。但这实际上可以解决问题,因为o中的所有规格都必须符合版本规范。
但正如我所说,我不确定