2014-09-12 116 views
0

這可能已經被覆蓋過,但我的SQL技術水平足夠低,我甚至不知道如何正確地搜索我想要的東西!查詢數據透視表的列值

我認爲我想要做的事情相對簡單,似乎使用pivoting可能是解決方案,但我真的不確定它的語法。

我有一個SELECT查詢,可以用此格式返回數據:

TeamID | PlayerName 
--------+------------------- 
    1 | Arthur Schiller 
    1 | Dimitre Rogatchev 
    1 | Mohamed Hechmeh 
    1 | Santosh Pradhan 
    2 | Adriano Ferrari 
    2 | Amanda Compagnone 
    2 | Danail Delchev 
    2 | David Bergin 

我想創建從ID柱與填充適當的名稱行,像這樣:

 1   |   2 
------------------+------------------- 
Arthur Schiller | Adriano Ferrari 
Dimitre Rogatchev| Amanda Compagnone 
Mohamed Hechmeh | Danail Delchev 
Santosh Pradhan | David Bergin 

目的是在php mysqli_fetch_assoc調用中使用返回的數據來顯示網站上的兩列。

在此先感謝您的幫助!

回答

2

不幸的是,MySQL不支持窗口函數來爲每個團隊的每個行生成一個唯一的值。您可以使用變量派生的「行號」或者你可以使用類似相關子查詢:

select 
    max(case when teamid = 1 then playername else '' end) Team1, 
    max(case when teamid = 2 then playername else '' end) Team2 
from 
(
    select TeamId, 
    PlayerName, 
    (select count(*) 
    from yourtable d 
    where t.teamId = d.TeamId 
     and t.playername <= d.PlayerName) rn 
    from yourtable t 
) d 
group by rn; 

SQL Fiddle with Demo

注意:根據您的數據大小,您可能會遇到一些性能問題。這對於較小的數據集效果很好。

+1

中做得更快,我唯一的問題是相關的子查詢...我會做同樣的但相關的子查詢可以真的很慢.. – 2014-09-12 17:31:31

+0

謝謝!這完全按照我想要的方式工作,但我會花一些時間研究@JohnRuddell提出的問題,因爲速度對我來說有點關注,我認爲它幾乎總是與這些東西有關! – 2014-09-12 17:38:49

+1

@JonEvans認爲它這樣..你有一個只有1000行的表這個查詢將爲表中的每1000行選擇所有1000行,並進行比較..這是100萬comparrisons – 2014-09-12 17:41:05

2

因爲沒有共同點樞軸轉動而離開的..你可以做的就是讓您加入上爲第二個隊行數不能用樞軸做..試試這個

SELECT t.playername as '1', f.playername as '2' 
FROM 
( SELECT @a := @a + 1 as id, playername 
    FROM players 
    WHERE teamid = 1 
)t 
LEFT JOIN 
( SELECT @b := @b +1 as id , playername 
    FROM players 
    WHERE teamid = 2 
)f ON f.id = t.id 
CROSS JOIN (SELECT @a :=0, @b :=0)t1 

DEMO

+0

感謝您的快速回復!我已經嘗試過這個查詢,並且它將行排序到正確的列(1和2)中,並且具有TeamID 1的玩家正確列在1列下,但是2列全部爲NULL。我把你的代碼搞亂了嗎? – 2014-09-12 17:23:45

+0

@JonEvans我不知道我將不得不看到這個查詢......看看我在我的答案中放置的演示...如果你有問題,請把它放在該演示中,看看怎麼了..我'我可以看到它並幫助 – 2014-09-12 17:25:01

+0

我發現它在你的演示中工作得很好,所以我會試着弄清楚爲什麼它在那裏工作,而不是在我的數據庫上,因爲在我看來他們都是安裝的一樣。 – 2014-09-12 17:40:32

1

這將在PHP代碼中執行起來要容易得多,而不是試圖在SQL中執行。只需執行查詢,然後遍歷結果,將它們添加到每個團隊的數組中。

一般來說,SQL對存儲,關聯,索引和查詢很有用。

將其按照正確的格式進行按摩需要顯示通常更容易,更乾淨,更整潔,但在代碼中。

+0

我已經在PHP中使用了它,但我想這不是正確的方法。標準實踐認爲只需從查詢中獲取我想要的數據然後通過PHP對其進行排序就可以了嗎? – 2014-09-12 17:34:56

+1

mysql可以很容易地處理這個操作,它很可能會比在PHP – 2014-09-12 17:38:08