2016-03-08 57 views
0

我正在嘗試構建產品及其選項的兼容性系統。 每個產品都有多個版本,並有各自的規格。 每個選項也有他們自己的一套規範sql加入等於數組

表關係作爲跟隨

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是bacause 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` 

我如何使這個查詢正確?它現在檢查它是否可以找到任何規格。但它必須檢查版本的每個specgroup是否是合格的,正確的或爲空。

Click here for Database design

回答

0

我不知道,但像這可能是工作

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

也許你需要再選擇的group_concats或對它們進行排序。但是這實際上可以做到這一點,因爲o中的所有規格都必須在版本規格中。

但正如我所說,我不知道

+0

JEP這之後的語法一些小的修改工作。最終結果如下: WHERE(e.id = 3或e.id IS NULL) AND(e2.product = p.id或e2.product IS NULL) AND(SELECT GROUP_CONCAT(os.specification, ',')= (GROUP_CONCAT(es.specification,','))) AND(og.id = 1)' – IMarks