2014-09-12 2 views
0

이것은 이전에 다루어 졌을 지 모르지만, SQL을 사용하는 스킬 레벨이 충분히 낮아 내가 원하는 것을 올바르게 검색하는 방법조차 잘 모르겠습니다!컬럼 값에 대한 테이블 피킹을위한 SQL 쿼리

내가 원하는 것은 상대적으로 간단하고 피벗 팅을 사용하는 것이 해결책 일 수 있다고 생각하지만 실제로 구문에 대해서는 확실하지 않습니다.

나는이 형식으로 데이터를 반환 할 수있는 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 

I는 다음과 같이 적절한 이름으로 가득 행으로 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

내가 가진 유일한 문제는 상관 된 하위 쿼리입니다.나는 동일한 일을했을지라도 상관 관계가있는 서브 쿼리는 정말로 느릴 수 있습니다 .. –

+0

고마워요! 이것은 내가 원했던 것과 똑같이 작동하지만, 속도가 나에게 다소 걱정스러운만큼 @JohnRuddell이 제기 한 문제를 조사하는데 시간을 할애 할 것입니다. –

+1

@JonEvans는 이런 식으로 생각합니다.이 쿼리는 1000 개의 행을 가진 테이블을 가지며이 쿼리는 테이블의 1000 개의 행마다 1000 개의 행을 모두 선택하고 비교 연산자를 수행합니다. 1 백만 개의 comparrisons입니다. –

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입니다. 내가 코드에 뭔가를 엉망으로 만들었습니까? –

+0

@ 존 에반스 나는 내가 쿼리를보아야 만할지 모르겠다 ... 내가 내 대답에 넣은 데모를 보아라. 문제가 있다면, 데모에 올려 놓고 무엇을 볼 수 있니? 그것을보고 도움이 될 것입니다. –

+0

당신의 데모에서 완벽하게 작동하는 것을 볼 수 있습니다. 그래서 저에게 그것이 설치되어있는 것처럼 보입니다. 똑같다. –

1

이것은 PHP 코드에서 SQL을 사용하는 것이 훨씬 쉽습니다. 쿼리를 수행 한 다음 결과를 반복하여 각 팀의 배열에 추가하십시오.

일반적으로 SQL은 저장, 연결, 인덱싱 및 쿼리에 적합합니다.

표시해야 할 올바른 형식으로 마사지하는 것이 일반적으로 쉽고 깨끗하며 코드에서 할 일이 적습니다.

+0

나는 PHP에서 원하는대로 실제로 작동하게 만들었지 만, 이것이 올바른 방법이 아니라고 생각했습니다. 그것은 표준 관례에 의해 나는 단지 쿼리에서 원하는 데이터를 얻은 다음 PHP를 통해 정렬 할 수 있다고 생각합니까? –

+1

mysql이이 작업을 쉽게 처리 할 수 ​​있으며 PHP에서 수행하는 것보다 가장 빠를 것입니다 –