2012-02-21 3 views
0

저는 현재 작은 스크립트를 작성 중입니다. 오늘 아침 이후로 붙어 있습니다.MySQL 3 행을 병합하고 결과를 계산하는 방법?

id | player1 | player2 | player3

샘플 행 :

가 여기 내 필드입니다
1 | toto | - | -
2 | tata | toto | -
3 | titi | tutu | -
4 | tata | titi | toto

내가 행의 재생기, player2, player3을 병합하고 항목의 수를 셀 수 있도록하고 싶습니다

, 내가 준 예시 행에 따르면, 이렇게 될 수있는 정상을 얻으려면 : 토토 3 타타 2 투투 2 티티 1

저는 대개 기본적인 쿼리를 작성하고 있습니다. 따라서, 정말 고생했습니다. 지금 몇 시간 동안 노력하고 있으며, 원하는 것을 얻을 수 없습니다. 어떤 아이디어입니까?

+0

모든 플레이어를 나열하는 테이블이 있습니까? – penartur

+0

'나는 player1 ...'열을 병합하고 싶습니까? –

+0

@ penartur : 아니오, 목록 없음, 모든 것이 테이블에 있습니다. @ Mosty Mostacho : 필요한 것은 player1, player2 또는 player3 행에 있는지 여부에 관계없이 모든 플레이어의 목록을 얻고 목록에있는 횟수를 계산하여 해당 플레이어의 목록을 갖도록하는 것입니다. 가장 많은 수의 기록. – badkarma

답변

0
select count(*) from ((select id,player1 as players from tablename) union (select id,player2 as players from tablename) union (select id,player3 as players from tablename)) as dummytable group by players 

나는 테스트를하지만, 논리 :) 보지 않은

+0

이 답변이 당신의 논리를 형성하는 데 도움이된다면 Upvote! – Akshay

2

당신이 뭔가에 밖으로 시작하는 것처럼 그것은 읽고, 이미 데이터베이스 디자인은 성능 문제로 이어질 수있는 매우-않은 정규화 줄을 내려. 이를 줄이기 위해서는 구조 조정을 고려해 볼 것을 제안합니다. 플레이어 1, 플레이어 2 및 플레이어 3은 모두 플레이어이므로 정규화 할 수 있습니다. 기존 테이블의 각 행은 game 또는 이와 유사한 것으로 간주되어 정규화 될 수 있습니다. 그런 다음 플레이어를 게임에 연결하는 작업이 나타납니다. 그렇게하면 동일한 플레이어 세부 정보를 여러 번 저장하지 않고 초기 삽입이 조금 더 복잡하더라도 테이블에 대한 모든 쿼리가 장기간에 더 빨리 끝납니다.

players (
    id INT UNSIGNED PK AI, 
    name VARCHAR 
    .... other player data .... 
) 

// Assumed a name here 
games (
    id INT UNSIGNED PK AI 
    .... game data .... 
) 

// Note the 2-field primary key here. Prevents 1 player being in the same game twice. 
playersInGames (
    game_id INT UNSIGNED PK, 
    player_id INT UNSIGNED PK, 
    playerNumber TINYINT UNSIGNED // You don't even need this, if you don't care about player number assigments just don't include this column 
) 

예 데이터

// players 
id  name 
1  toto 
2  tata 
3  titi 
4  tutu 

// games 
id 
1 
2 
3 
4 

// playersInGames 
game_id  player_id  playerNumber 
1   1    1 
2   2    1 
2   1    2 
3   3    1 
3   4    2 
4   2    1 
4   3    2 
4   1    3 

이것은 차례로, 당신이 그런

SELECT 
    p.*, 
    COUNT(DISTINCT pig.game_id) AS gamesPlayerIsIn 
FROM players AS p 
LEFT JOIN playersInGames AS pig 
ON pig.player_id = p.id 
GROUP BY p.id 

편집 당신이 정말로 테이블 스키마를 변경하지 않는 경우와 같은 간단한 쿼리를 수행 할 것 다음은 충분하지만 코드를 유지하는 사람은 누구나 울게됩니다. 각 플레이어는 테이블 행당 한 번 씩 계산됩니다.

SELECT 
    players.playerName, 
    COUNT(DISTINCT players.id) AS numberOfRows 
FROM (
    (
     SELECT DISTINCT id, player1 AS playerName FROM tableName 
    ) UNION DISTINCT (
     SELECT DISTINCT id, player2 AS playerName FROM tableName 
    ) UNION DISTINCT (
     SELECT DISTINCT id, player3 AS playerName FROM tableName 
    ) 
) AS players 
+0

올바른 방법으로이 작업을 수행해야합니다. – Kaii

관련 문제