2015-04-06 67 views
0

我有两个表; - 物品表 - 包含有关产品的基本信息:名称,产品的基本价格以及产品是否具有任何属性 - 它们将以下列格式指定:属性的选项ID - 属性的值ID。 (一个选项的例子是颜色或大小,值的例子​​是红色的)。 例如:通过拆分字段连接表

项目表

id | name |attributes |price 
1 | a |13-49  | 5.00 
2 | b |5-101,13-77| 5.00 
3 | c |   | 5.00 
4 | b |5-102,13-70| 5.00 
  • 第二个表有充分的选择和价值分配给产品 - 如果还有信息(id_option和ID_VALUE意思是一样的,在上表)属性值会更改产品的基本价格(更改)以及更改的内容(值)。

items_attributes

id |id_item|id_option|id_value |change | value 
1 | 1 | 13 | 49  | 1 |10.00 
2 | 2 | 5  | 101  | 1 | 5.50 
3 | 2 | 13 | 77  | 1 | 0.50 
4 | 4 | 5  | 102  | 0 | 0 
5 | 4 | 13 | 70  | 1 | 1.00 

我希望得到一个表女巫是一样的第一,但根据items_attributes表中注意到的变化计算出的价格。

id | name |attributes | price 
1 | a |13-49  | 15.00 
2 | b |5-101,13-77| 11.00 
3 | c |   | 5.00 
4 | b |5-102,13-70| 6.00 

如何拆分items表中的属性并使用它来连接两个表?

+0

修复您的数据结构以具有联结表。 SQL有一个伟大的数据结构来存储列表。它被称为“表格”,而不是“字符串”。 – 2015-04-06 11:05:07

+0

是的,我知道。这是我得到并必须与其他人合作的结构。 – 2015-04-06 11:14:02

回答

0

您可以用联接使用find_in_set()做到这一点:

select i.id, i.name, i.attributes, 
     i.price + coalesce(sum(ia.value)) as price 
from items i left join 
    items_attributes ia 
    on find_in_set(concat(ia.id_option, '-', ia.id_attribute), i.attributes) > 0 
group by i.id; 

不幸的是,你不能提高使用索引这个查询的性能。为了获得更好的性能,您需要更好的数据结构。

+0

经过litle改款:'选择i.id,i.name,i.attributes, i.price + IFNULL(coalesce(sum(ia.value)),0)作为价格 来自我加入的项目 items_attributes ia on find_in_set(concat(ia.id_option,' - ',ia.id_value),i.attributes)> 0 group by i.id;' – 2017-03-12 12:44:47