2013-04-05 182 views
0

我有两个MySQL数据库表:查询MySQL数据库从另一个表中获取值

房车

----------------------- 
| id | status | name | 
----------------------- 
| 1 | active | mh 1 | 
| 2 | active | mh 2 | 
----------------------- 

motorhome_meta

---------------------------------------------- 
| 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_meta表中的值。或者换句话说,如果我与ID选择在 motorhome表中的行1.

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

有些时候,我可能需要使用WHERE语句对两个表中如WHERE motorhome.status='active'WHERE motorhome_meta.meta_key='size'

+0

SELECT * FROM房车为m JOIN motorhome_meta AS毫米ON m.id = motorhome_id – dikirill 2013-04-05 17:56:32

回答

5

可以使用聚合函数与CASE从您的数据行创建列:

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 

SQL Fiddle with Demo。这给出结果:

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

您也可以使用这种变化,如果有上(motorhome_id, meta_key)组合UNIQUE约束:

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' ; 

参见:SQL-Fiddle-2

+0

假设m.id是唯一的,MySQL会原谅遗漏剩余的非汇总列 - 但我是这是很好的做法。 – Strawberry 2013-04-05 18:05:43

+1

@Strawberry这是正确的,但不允许在其他数据库上使用。我倾向于在MySQL中打开[ONLY_FULL_GROUP_BY](http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html#sqlmode_only_full_group_by)打开的查询,这是其他数据库。 – Taryn 2013-04-05 18:08:45

0

的问题是更的Relational Division

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 

OUTPUT

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