0

我在 MySQL 中有一个表结构,其中具有以下结构:

home_id、home_name、添加日期

我有另一个名为 specs 的表,其结构如下:

home_id、spec_key、spec_value

在其中我可以有如下条目:

1, price, 500000
1, location, 90210
1, rooms, 3
1, washrooms, 3
1, furnished_basement, 0
2, location, 14410
2, garage_size, 3
2, price, 335000

出于搜索目的,我想对上述内容进行非规范化。表 ( denormalized_homes) 结构类似于:

home_id, price, location, rooms, washroom, furnished_basement, garage_size, dateadded

从上面可以看出,a) 并非所有条目都具有所有列的值。b) 表结构不利于INSERT INTOdenormalized_homes select * fromspecs 类型查询。我也不能使用存储过程或触发器(主机规则)。

到目前为止,我采取的策略是将 home_id 插入denormalized_homes表中,然后使用类似于以下查询的内容遍历规范中的每个字段:

UPDATE `denormalized_homes` dh, specs s SET dh.price = s.spec_value WHERE dh.home_id = s.home_id AND s.spec_key = "price";

为每个可能的列创建一个查询然后运行它们是可行的。我只是在想一定有更好的方法,是吗?

4

1 回答 1

1

我认为你可以这样做:

INSERT INTO denormalized_homes ()

SELECT h.home_id,
       price.spec_value price,
       location.spec_value location,
       rooms.spec_value rooms,
       washroom.spec_value washroom,
       furnished_basement.spec_value furnished_basement,
       garage_size.spec_value garage_size,
       h.date_added

FROM   homes h

       LEFT JOIN specs price
       ON price.home_id = h.home_id and spec_key = 'price'

       LEFT JOIN specs location
       ON price.home_id = h.home_id and spec_key = 'location'       

       LEFT JOIN specs rooms
       ON price.home_id = h.home_id and spec_key = 'rooms'

       LEFT JOIN specs washroom
       ON price.home_id = h.home_id and spec_key = 'washroom'

       LEFT JOIN specs furnished_basement
       ON price.home_id = h.home_id and spec_key = 'furnished_basement'

       LEFT JOIN specs garage_size
       ON price.home_id = h.home_id and spec_key = 'garage_size'
于 2012-10-10T13:44:28.800 回答