당신이 뭔가에 밖으로 시작하는 것처럼 그것은 읽고, 이미 데이터베이스 디자인은 성능 문제로 이어질 수있는 매우-않은 정규화 줄을 내려. 이를 줄이기 위해서는 구조 조정을 고려해 볼 것을 제안합니다. 플레이어 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
모든 플레이어를 나열하는 테이블이 있습니까? – penartur
'나는 player1 ...'열을 병합하고 싶습니까? –
@ penartur : 아니오, 목록 없음, 모든 것이 테이블에 있습니다. @ Mosty Mostacho : 필요한 것은 player1, player2 또는 player3 행에 있는지 여부에 관계없이 모든 플레이어의 목록을 얻고 목록에있는 횟수를 계산하여 해당 플레이어의 목록을 갖도록하는 것입니다. 가장 많은 수의 기록. – badkarma