2011-09-06 120 views
1

對於MySQL查詢有一個奇怪的問題,我無法真正弄清楚如何按照我希望組織數據。複雜的MySQL查詢,聯合,相交或自然連接?

我在PHP中構建搜索腳本,但數據庫結構不是我想要的樣子。

好了,說我有三個表(這些是完全由):

EMPLOYES 
id  name  city  hired 
------------------------------------------------- 
1  Jim   0810  2001 
2  Stan  6777  2002 
3  George  6532  2009 

SALARY 
id  amount  year 
-------------------------------- 
1  2000  2009 
1  2500  2010 
1  2800  2011 
2  2100  2009 
2  2200  2010 
2  2500  2011 
3  2200  2009 
3  2300  2010 
3  2800  2011 

CONTACT 
city areacode cityname 
----------------------------- 
0810 0300  Tampa 
6777 0800  Miami 
6532 0210  Atlanta 

現在,如果我堅持LEFT JOIN的等我能夠得到的結果是這個樣子,哪裏它重複每行中的工資表:

name cityname hired salary 
---------------------------------- 
Jim  Tampa  2001 2000 
Jim  Tampa  2001 2500 
Jim  Tampa  2001 2800 
... 

但我真正想要的是這樣的:

name cityname hired 2009 2010 2011 
------------------------------------------------ 
Jim  Tampa  2001 2000 2500 2800 
... 

任何我可以用SQL實現的方法?

+0

MySQL的東西並不支持'INTERSECT'我相信,但它看起來像你需要一個'PIVOT無論如何,'/'CROSS TAB'查詢。 –

回答

0
SELECT EMPLOYES.*, GROUP_CONCAT(salery) 
FROM EMPLOYES JOIN SALERY USING(id) 
GROUP BY id 

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

但你最好用手工做的,而不是在SQL。當我說「手工」時,我的意思是通過編寫一個可以幫助你的程序。我們都是程序員,不是嗎?

+0

我會試試看!希望有另一種方式,我唯一的數據源是來自外部來源,具有.xls格式的13000條記錄。沒辦法,我要手動編輯=/ – Marcus

+0

不要直接用手寫,寫一個程序。 – sanmai

+0

哈哈,真的 - 也許應該看看它。 – Marcus

1

您需要一個PIVOT查詢。因爲無論如何你的桌子都是這樣構成的,所以我會把這個桌子做成桌子,這樣你就可以看到這個方法。

name cityname year salary 
---------------------------------- 
Jim  Tampa  2009 2000 
Jim  Tampa  2010 2500 
Jim  Tampa  2011 2800 

轉動這一點,你會用

SELECT name, 
     cityname, 
     MAX(CASE WHEN year = 2009 then salary end) AS `2009`, 
     MAX(CASE WHEN year = 2010 then salary end) AS `2010`, 
     MAX(CASE WHEN year = 2011 then salary end) AS `2011`, 
FROM T 
GROUP BY name, 
     cityname 
0

正如馬丁評論,什麼youre尋找被稱爲在SQL Server PIVOT。 AFAIK MySQL不支持它。如果你知道今年的範圍中的youre事先然後intrested你應該能夠構建使用LEFT JOIN的查詢,如

SELECT 
    E.name, 
    S2009.amount AS `2009`, 
    S2010.amount AS `2010`, 
    ... 
FROM EMPLOYES E 
LEFT JOIN SALARY S2009 ON(S2009.id = E.id)AND(S2009.year = 2009) 
LEFT JOIN SALARY S2010 ON(S2010.id = E.id)AND(S2010.year = 2010) 
...