2013-10-24 107 views
1

我有以下表結構MySQL查詢,使用字段作爲列

+-------+------------+-----------+---------------+ 
| id |assigned_to | status | group_id  |    
+-------+------------+-----------+---------------+ 
| 1  | 1001  | 1   | 19   | 
+-------+------------+-----------+---------------+ 
| 2  | 1001  | 2   | 19   | 
+-------+------------+-----------+---------------+ 
| 3  | 1001  | 1   | 18   | 
+-------+------------+-----------+---------------+ 
| 4  | 1002  | 2   | 19   | 
+-------+------------+-----------+---------------+ 
| 5  | 1002  | 2   | 19   | 
+-------+------------+-----------+---------------+ 

我想獲得的信息的格式如下

+-------+------------+-----------+ 
|  | 1001  | 1002 |   
+-------+------------+-----------+ 
| 1  | 1  | 0  | 
+-------+------------+-----------+ 
| 2  | 1  | 2  | 
+-------+------------+-----------+ 

所以基本上我期待使用分配以字段作爲列名稱。然後這些行代表狀態。因此,例如在表中,我們有兩行用戶1002的狀態爲2,因此總和顯示在該特定狀態行上。

請注意,group_id必須是19.因此,爲什麼我在我的桌子上排除了id爲3的行。

有人可以指出我在正確的方向。我確定這種類型的查詢有一個名字,但是我不能用我的生活把這個寫成文字。我已經嘗試了各種其他查詢,但他們都沒有接近這個。

+2

這是一個數據透視查詢,而且mysql不支持它們。有解決方法,但查詢變得非常非常難看,非常迅速。在代碼中進行行 - >列轉換,並使用常規查詢。 –

+0

@MarcB感謝您花時間回答。你可以擴展一下這個,或者指向一行關於這一行 - >列轉換的文檔。非常感激。 –

+0

@MarcB有趣的是,我剛剛與Skype上的某個人說過,他們已經完成了這項工作,查詢大概有100行,看起來很糟糕。想想我會走下一條PHP路線。我寧願有一些額外的PHP行,而不是難以管理的不可讀的單個查詢。 –

回答

1

馬克B是正確的,有沒有辦法轉動表 - 即。將一個字段的內容轉換爲列,除非你做了一些假設,比如認爲assigned_to的值在某種程度上是固定的。

另一方面,這是一類可以通過程序解決的問題。這不是一個簡單的程序,但它可以完成這項工作。

我最近在java中做了一個和這個類似的程序,如果你有興趣,我可以在這裏發佈它的核心。

+0

謝謝你的答案。我想我必須用幾個查詢和一些代碼來完成。欣賞此優惠。 –

1

你可能需要閱讀這篇文章中的​​

,我會像

SELECT 
    assigned_to, 
    COUNT(CASE assigned_to WHEN '1001' THEN 1 ELSE 0 END) AS '1001', 
    COUNT(CASE assigned_to WHEN '1002' THEN 1 ELSE 0 END) AS '1002' 
FROM table 
WHERE group_by = 19 
GROUP BY assigned_to WITH ROLLUP; 

或類似的東西(我沒有測試此代碼..)

文章,他這樣做使用SUM()你必須做到這一點COUNT()並添加一個WHERE約束group_id

希望這可以幫助

+0

是的,這是我在中期,但這假設您在assigned_to列中有固定數量的值,並且在不更改查詢的情況下也無法更改。 –

+0

謝謝你的回答,但@RaulLuna是正確的,我有一個動態的用戶列表,所以不幸的是這還不夠,儘管你upvote。 –

+0

@JonPaulH yeap ..在文章中他們展示瞭如何使用一個過程生成這個查詢。或者你可以在PHP中生成這個查詢..無論如何這仍然是一個醜陋的查詢:)祝你好運 – pleasedontbelong