2014-02-17 54 views
0

使用MySQL和我有類似以下兩個表。這兩個實際上有更多的行和列或多列,但爲了便於閱讀,我只放了幾個SQL - 內部聯接和列行

wp_ahm_files

ID | Field_A | Field_B | Field_C 
-------------------------------- 
69 | ABC  | DEF  | GHI 

wp_ahm_filemeta

PID控制在這個表指的是ID上面的表格

ID | pID | Name | Value 
--------------------------------- 
25 | 69 | Version | 12345 
26 | 69 | Expiry | 29/08/1981 

我該如何帶回結果牛逼如

ID | Field_A | Field_B | Field_C | Version | Expiry 
------------------------------------------------------- 
69 | ABC  | DEF  | GHI  | 12345 | 29/08/1981 

回答

2

你應該能夠加入到你的wp_ahm_filemeta兩次,得到的結果:

select f.id, 
    f.field_a, 
    f.field_b, 
    f.field_c, 
    m1.value version, 
    m2.value expiry 
from wp_ahm_files f 
left join wp_ahm_filemeta m1 
    on f.id = m1.pid 
    and m1.name = 'Version' 
left join wp_ahm_filemeta m2 
    on f.id = m2.pid 
    and m2.name = 'Expiry'; 

SQL Fiddle with Demo。關鍵是在JOIN條件下放置一個過濾器,以返回所需的具體name值的行。

您也可以通過使用聚合函數CASE表達式的數據行轉換爲列:

select f.id, 
    f.field_a, 
    f.field_b, 
    f.field_c, 
    max(case when m.name = 'Version' then m.value end) version, 
    max(case when m.name = 'Expiry' then m.value end) expiry 
from wp_ahm_files f 
left join wp_ahm_filemeta m 
    on f.id = m.pid 
group by f.id, f.field_a, f.field_b, f.field_c; 

SQL Fiddle with Demo

1

喜歡的東西

select a.*, version.value version, expiry.value expiry 
    from a join 
    (select * from b where name = 'Version') version 
    on version.table_a_id = a.id 
    join 
    (select * from b where name = 'Expiry') expiry 
    on expiry.table_a_id = a.id 
+0

對不起,我得不到任何回報。我已經用實際的表名改變了問題。如果我只留下一個聯接,那麼它就可以工作。與這兩個,沒有什麼 – pee2pee

+0

檢查什麼的子查詢return-例如:SELECT * FROM b,其中名稱=「到期」 –