2016-07-25 38 views
2

在數據庫之外我試圖將兩個表合併成一個搜索查詢。innerjoin或另一種組合數據的方式

表1:常見問題

| faq_id | title | status | url_key | 
| ------ | ----- | ------ | ------- | 
| 1 | Test | 1 | go.html | 

表2:faq_value

| faq_value_id | faq_id | attribute | value   | 
| ------------ | ------ | --------- | -------  | 
|  1  | 1 | metakey | testing  | 
|  2  | 1 | metadesc | this is a test | 
|  3  | 1 | meta_image | test.jpg  | 

現在我想要的查詢結果是這樣的:

| faq_id | title | status | metadesc | metakey | meta_image | url_key | 
| ------ | ----- | ------ | -------- | ------- | ---------- | ------- | 
| 1 | Test | 1 | this is a | testing | test.jpg | go.html | 

我嘗試到目前爲止已失敗:

SELECT 
faq.faq_id,faq.title,status, 
(SELECT faq_value.value AS metadesc WHERE faq_value.attribute_code = 'metadesc'), 
(SELECT faq_value.value AS metakey WHERE faq_value.attribute_code = 'metakey'), 
(SELECT faq_value.value AS meta_image FROM faq_value WHERE faq_value.attribute_code = 'meta_image') 
faq.url_key, 
FROM faq 
INNER JOIN faq_value ON faq_value.faq_id = faq.faq_id 

我相信我只是俯視愚蠢的東西,但只是不能發現。這一個踢一個SQL錯誤:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE faq_value.attribute_code = 'metadesc'), (SELECT faq_value.value AS metakey' at line 2 

回答

0

可以使用3內部聯接上faq_value表

SELECT 
    faq.faq_id 
    , faq.title 
    , faq.status 
    , b.value as metadesc 
    , c.value as metakey 
    , d.value as metakey 
    , faq.url 
from faq 
INNER JOIN faq_value as b on b.faq_id = faq.faq_id and b.attribute_code = 'metadesc' 
INNER JOIN faq_value as c on c.faq_id = faq.faq_id and c.attribute_code = 'metakey' 
INNER JOIN faq_value as d on d.faq_id = faq.faq_id and d.attribute_code = 'meta_image'  
+0

非常感謝你。這解決了我的問題 – Jacco

0

http://sqlfiddle.com/#!9/c615f/4

SELECT 
    faq.faq_id 
    , faq.title 
    , faq.status 
    , fv.metadesc 
    , fv.metakey 
    , fv.metakey 
    , faq.url_key 
FROM faq 
INNER JOIN 
(SELECT 
    faq_id, 
    MAX(IF(attribute = 'metadesc',value,null)) metadesc, 
    MAX(IF(attribute = 'metakey',value,null)) metakey, 
    MAX(IF(attribute = 'meta_image', value, null)) meta_image 
FROM faq_value 
GROUP BY faq_id) fv 
ON fv.faq_id = faq.faq_id 
0

一個簡單的方法來做到這一點是通過轉動基於屬性列

使用使用UNION ALL(Aliase d爲A ...這將是你faq_value表):

SELECT FAQ_ID, 
MAX(CASE WHEN Attribute = 'MetaKey' THEN Attribute ELSE '' END) As MetaKey , 
MAX(CASE WHEN Attribute = 'MetaDesc' THEN Attribute ELSE '' END) As MetaDesc , 
MAX(CASE WHEN Attribute = 'meta_image' THEN Attribute ELSE '' END) As metaimage 

FROM 
( 

Select 'MetaKey' as Attribute , 1 as FAQ_ID UNION ALL 
Select 'MetaDEsc' as Attribute , 1 as FAQ_ID UNION ALL 
Select 'meta_image' as Attribute , 1 as FAQ_ID 

) A 

GROUP BY FAQ_ID 

現在,所有你需要做的是回答問題表連接,以獲得其他列

相關問題