MySQL根据主数据表查询只有key和value的数据项表

标签 mysql sql

我有以下表格

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

所以我的问题是:

  1. 我需要第三个表来连接这两个表吗?
  2. 获取上述结果的确切 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/

相关文章:

php - 如何使用 PHP 循环遍历按十年分组的记录的 MySQL 结果集?

mysql - 有一个表的其中一列大部分为空或创建一个新表并引用它是否更有效?

sql - 在SQL中使用子查询更新多行

php - 跟踪用户在我的网站上花费的时间

sql - Oracle SQL数据透视查询

mysql - 从多 SELECT 子查询返回多行

mysql - mysql select 语句中的回退条件

mysql - 在 spark 中使用 JDBC 驱动程序限制与 MySQL 数据库的连接数

php - Laravel 5.5 - 将 MySQL 查询传递给 Javascript 函数/数据表

php - 使用 PHP 链接 SQL 表