查询MySQL数据库从另一个表中获取值
我有两个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'
。
可以使用聚合函数与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
假设m.id是唯一的,MySQL会原谅遗漏剩余的非汇总列 - 但我是这是很好的做法。 – Strawberry 2013-04-05 18:05:43
@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
的问题是更的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 ║
╚════╩════════╩══════╩═══════╩════════╝
SELECT * FROM房车为m JOIN motorhome_meta AS毫米ON m.id = motorhome_id – dikirill 2013-04-05 17:56:32