如何在MySQL表中选择垂直数据

时间:2014-10-21 05:10:35

标签: mysql

如果我有这样的表:

ID color size weight
1  red   2    3
2  green 4    5

所以要运行一个mysql查询来查找颜色的ID号:红色和大小:2和重量:3我可以这样做:

select ID from table where color=red AND size=2 AND weight=3

随着属性的增加,除了颜色,重量,大小,里程,速度等......我想保持表缩放,以这种方式组织它是有意义的

ID  ID2  property  value
1   1    color     red
2   1    size      2
3   1    weight    3
4   2    color     green
5   2    size      4
6   2    weight    5

如何在此处运行选择查询以查找颜色的ID号:红色和大小:2和重量:3

2 个答案:

答案 0 :(得分:3)

对于键值结构,一种方法是自连接次数与否。您在案例中喜欢的属性有3个属性(颜色,重量,大小),因此您需要2个自连接,并且对于每个属性,根据以下属性中的属性筛选结果我已为别名t提供了唯一的别名我已使用t.property = 'color'和值t.value = 'red'过滤了行,并且与其他别名相同,以找到符合所提供条件的所需ids,因此,如果您的条件因您需要的其他属性而增加另一个自连接和上面相同的过滤

select t.id2 
from test t
join test t1 on(t.id = t1.ID2)
join test t2 on(t.id = t2.ID2)
where t.property = 'color'
and t1.property = 'size'
and t2.property = 'weight'
and t.value = 'red'
and t1.value = '2'
and t2.value = '3'

DEMO

答案 1 :(得分:1)

如果有很多属性(只有少数属性可能会引起关注),那么对于本案例专门发明的Star schema可能会更好。

尽管如此,您描述的不到10个属性并不是解决这种并发症的理由。根据KISS原则,您可以使用初始表格。