我有以下表格
data [table]
- id [primary key]
- context
data_items [table]
- item_id [primary key]
- data_id [foreign key]
- key
- value
对于“数据”表,它将包含类似的内容
id context
-- -------
1 car
2 office
3 car
4 food
对于“data_items”表,它将包含父“data”表中的项目,例如
item_id data_id key value
------- ------- ----- ------------
1 1 name Benz
2 1 model C-Class
3 1 price 1000000
4 2 city New York
5 2 name Empire State
6 2 floor 5th
7 2 room 504
8 1 name BMW
9 1 model 528i Sedan
10 1 price 80000
11 3 name Ford
12 3 model Hybrid SE
13 3 price 30000
14 3 name Ford
15 3 model 528i Sedan
16 3 price 80000
17 3 name BMW
18 3 model 528i Sedan
19 3 price 80000
20 2 city New York
21 2 name Chrystler
22 2 floor 2nd
23 2 room 24A
24 4 type American
25 4 name Hamburger
26 4 price $50
27 4 type Chinese
28 4 name Noodle
29 4 price $20
30 2 city Los Angeles
31 2 name US Bank Tower
32 2 floor 10th
33 2 room 105C
所以如果我运行类似的 SQL 查询
SELECT * FROM data_items ........ WHERE data_id = 2;
它应该给我以下列表
data_id city Name Floor room
------- -------- ------------- ----- ----
2 New York Empire State 5th 504
2 New York Chrysler 2nd 24A
2 Los Angeles US Bank Tower 10th 105C
如果我运行以下 SQL 查询
SELECT * FROM data_items ........ WHERE data_id = 4;
它应该给我以下列表
data_id type Name price
------- -------- ------------- ----
4 American Hambergur $50
4 Chinese Noodle $20
所以我的问题是:
- 我需要第三个表来连接这两个表吗?
- 获取上述结果的确切 SQL 命令是什么?
谢谢。
最佳答案
这种类型的表称为 EAV model (实体-属性-值模型),尽管它们在插入数据时提供了很大的自由度,但该数据比规范化模型更难查询(但在某些情况下它们很有用)。对于您的特定问题,您需要事先知道要查询的 data_id
的值是多少,并对每个 data_id
使用不同的查询。例如,要获取 data_id = 2
的结果:
SELECT `data_id`,
MIN(CASE WHEN `key` = 'city' THEN `value` END) AS `city`,
MIN(CASE WHEN `key` = 'name' THEN `value` END) AS `name`,
MIN(CASE WHEN `key` = 'floor' THEN `value` END) AS `floor`,
MIN(CASE WHEN `key` = 'room' THEN `value` END) AS `room`
FROM data_items
WHERE data_id = 2
GROUP BY `data_id`
对于 data_id = 4
:
SELECT `data_id`,
MIN(CASE WHEN `key` = 'type' THEN `value` END) AS `type`,
MIN(CASE WHEN `key` = 'name' THEN `value` END) AS `name`,
MIN(CASE WHEN `key` = 'price' THEN `value` END) AS `price`
FROM data_items
WHERE data_id = 4
GROUP BY `data_id`
关于MySQL根据主数据表查询只有key和value的数据项表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20665091/