查询MySQL数据库以从另一个表获取值

查询MySQL数据库以从另一个表获取值,mysql,sql,database,database-design,metadata,Mysql,Sql,Database,Database Design,Metadata,我有两个MySQL数据库表: 房车 ----------------------- | id | status | name | ----------------------- | 1 | active | mh 1 | | 2 | active | mh 2 | ----------------------- 摩托之家酒店 ---------------------------------------------- | id | motorhome_id | meta_key |

我有两个MySQL数据库表:

房车

-----------------------
| id  | status | name |
-----------------------
|  1  | active | mh 1 |
|  2  | active | mh 2 |
-----------------------
摩托之家酒店

----------------------------------------------
| id  | motorhome_id | meta_key | meta_value |
----------------------------------------------
|  1  | 1            | size     | large      |
|  2  | 1            | fuel     | petrol     |
|  3  | 2            | size     | small      |
|  4  | 2            | fuel     | petrol     |
----------------------------------------------
我需要的是一个查询,它允许我从
motorhome
表中选择一行,其中包含
motorhome\u meta
表中的值。或者换句话说,如果我在
motorhome
id为1的表

----------------------------------------
| id  | status | name | size  | fuel   |
----------------------------------------
|  1  | active | mh 1 | large | petrol |
----------------------------------------

在某些情况下,我可能需要对表使用where语句,例如
where motorhome.status='active'
where motorhome\u meta.meta\u key='size'
您可以使用带有
大小写的聚合函数从数据行创建列:

select m.id,
  m.status,
  m.name,
  max(case when h.meta_key= 'size' then h.meta_value end) size,
  max(case when h.meta_key= 'fuel' then h.meta_value end) fuel
from motorhome m
inner join motorhome_meta h
  on m.id = h.motorhome_id
-- where m.id = 1
group by   m.id, m.status, m.name
看。结果如下:

| ID | STATUS | NAME |  SIZE |   FUEL |
---------------------------------------
|  1 | active | mh 1 | large | petrol |
|  2 | active | mh 2 | small | petrol |

如果对
(房车id,元钥匙)
组合有
唯一的
约束,您也可以使用此变体:

select m.id,
  m.status,
  m.name,
  h1.meta_value  size,
  h2.meta_value  fuel
from motorhome m
left join motorhome_meta h1           -- or:  inner join
  on  m.id = h1.motorhome_id          -- depending on your need (or not)
  and h1.meta_key = 'size'            -- to show motorhomes
left join motorhome_meta h2           -- that have  only 'fuel'
  on  m.id = h2.motorhome_id          -- or only 'size'
  and h2.meta_key = 'fuel' ; 

请参阅:

您可以使用带有
大小写的聚合函数来从数据行创建列:

select m.id,
  m.status,
  m.name,
  max(case when h.meta_key= 'size' then h.meta_value end) size,
  max(case when h.meta_key= 'fuel' then h.meta_value end) fuel
from motorhome m
inner join motorhome_meta h
  on m.id = h.motorhome_id
-- where m.id = 1
group by   m.id, m.status, m.name
看。结果如下:

| ID | STATUS | NAME |  SIZE |   FUEL |
---------------------------------------
|  1 | active | mh 1 | large | petrol |
|  2 | active | mh 2 | small | petrol |

如果对
(房车id,元钥匙)
组合有
唯一的
约束,您也可以使用此变体:

select m.id,
  m.status,
  m.name,
  h1.meta_value  size,
  h2.meta_value  fuel
from motorhome m
left join motorhome_meta h1           -- or:  inner join
  on  m.id = h1.motorhome_id          -- depending on your need (or not)
  and h1.meta_key = 'size'            -- to show motorhomes
left join motorhome_meta h2           -- that have  only 'fuel'
  on  m.id = h2.motorhome_id          -- or only 'size'
  and h2.meta_key = 'fuel' ; 

请参阅:

问题更多的是一种关系划分

SELECT  a.id,
        a.status,
        a.name,
        MAX(CASE WHEN b.meta_key= 'size' THEN b.meta_value END) size,
        MAX(CASE WHEN b.meta_key= 'fuel' THEN b.meta_value END) fuel
FROM    motorhome a
        INNER JOIN motorhome_meta b
            ON a.ID = b.motorhome_ID
WHERE   a.status = 'active' AND
        (
            (b.meta_key = 'size' AND b.meta_value = 'large') OR
            (b.meta_key = 'fuel' AND b.meta_value = 'petrol') 
        )
GROUP   BY a.id, a.status, a.name
HAVING  COUNT(*) = 2
输出

╔════╦════════╦══════╦═══════╦════════╗
║ ID ║ STATUS ║ NAME ║ SIZE  ║  FUEL  ║
╠════╬════════╬══════╬═══════╬════════╣
║  1 ║ active ║ mh 1 ║ large ║ petrol ║
╚════╩════════╩══════╩═══════╩════════╝

问题更多的是一种关系划分

SELECT  a.id,
        a.status,
        a.name,
        MAX(CASE WHEN b.meta_key= 'size' THEN b.meta_value END) size,
        MAX(CASE WHEN b.meta_key= 'fuel' THEN b.meta_value END) fuel
FROM    motorhome a
        INNER JOIN motorhome_meta b
            ON a.ID = b.motorhome_ID
WHERE   a.status = 'active' AND
        (
            (b.meta_key = 'size' AND b.meta_value = 'large') OR
            (b.meta_key = 'fuel' AND b.meta_value = 'petrol') 
        )
GROUP   BY a.id, a.status, a.name
HAVING  COUNT(*) = 2
输出

╔════╦════════╦══════╦═══════╦════════╗
║ ID ║ STATUS ║ NAME ║ SIZE  ║  FUEL  ║
╠════╬════════╬══════╬═══════╬════════╣
║  1 ║ active ║ mh 1 ║ large ║ petrol ║
╚════╩════════╩══════╩═══════╩════════╝

选择*FROM motorhome AS m JOIN motorhome\u meta AS mm ON m.id=motorhome\u id选择*FROM motorhome AS m JOIN motorhome\u meta AS mm ON m.id=motorhome\u id假设m.id是唯一的,MySQL将原谅省略剩余的非聚合列,但我认为这是一种良好的做法,这是正确的,但在其他数据库上是不允许的。我更喜欢在MySQL中打开查询,这在其他数据库中是标准的。假设m.id是唯一的,MySQL将原谅省略剩余的非聚合列,但我认为这是一种好的做法。这是正确的,但在其他数据库中是不允许的。我更喜欢编写假设在MySQL中打开的查询,这是其他数据库的标准。