2014-04-28 3 views
0

저는 게임을위한 최고 기록을 많이 가진 MySQL 데이터베이스를 가지고 있습니다. 나는 점수의 최대 값을 가진 "개인 최고"항목을 얻고 싶습니다.MySQL에서 최대 값을 가진 항목을 얻으십시오.

나는 데이터베이스에서 더 많은 이름을 얻을 때까지 나는 생각하고 해결책을 찾았고 완전히 다른 결과를 반환합니다. 지금까지

내 코드 : 값이 많이 들어

SELECT name, score, date, version, mode, custom 
FROM highscore 
WHERE score = 
    (SELECT MAX(score) 
      FROM highscore 
      WHERE name = 'jonte' && gamename = 'game1') 

이 실제로 같은 올바른 값을 반환

JONTE 240 2014-04-28 02:52:33 1 0 2053  

그것은 몇 백 항목, 다른 일부와 함께 잘 작동 이름. 그러나 새 항목을 추가하고 이름을 'gabbes'로 바꾸면 새로운 이름 대신 여러 항목의 목록이 표시됩니다. 데이터베이스의 항목이 데이터의 일부 차이점과 완전히 동일하게 보일 때 논리가 표시되지 않습니다.

JONTE 176 2014-04-28 11:03:46 1 0 63 
GABBES 176 2014-04-28 11:09:12 1 0 3087  

위의 내용은 두 개의 엔트리가 있지만 때로는 10-20 개의 항목을 연속으로 반환 할 수도 있습니다.

어떤 도움이 필요합니까?

+0

원하는 DDL (및/또는 sqlfiddle)과 함께 원하는 결과 세트를 제공하십시오. – Strawberry

+0

글쎄, 당신의 테이블은 최대 점수와 같은 점수를 가진 하나 이상의 엔트리를 가질 수 있습니다. 이 경우 원하는 결과물은 무엇입니까? – Guneli

답변

1

각 사람에 대한 높은 점수를 원한다면, 당신은 ...

SELECT name, score, date, version, mode, custom 
FROM highscore h1 
WHERE score = 
    (SELECT MAX(score) 
      FROM highscore h2 
      WHERE name = h1.name && gamename = 'game1') 

참고이

SELECT name, max(score) 
FROM highscore 
WHERE gamename = 'game1' 
GROUP BY name 

또는 ... 당신은이 작업을 수행 할 수 있습니다 (개인 최고 IE) 할 수 : SQL에서 하위 절에 name = h1.name 술어가 누락되었습니다.

그러나이 두 번째 옵션은 동일한 높은 점수를 여러 번 기록한 경우 동일한 사람에게 여러 행을 제공합니다.

+0

첫 번째 해결책은 내가 일찍 시작한 것인데, 이름 당 최고 점수로만 작동하지만 그 항목의 다른 필드를 원한다면 작동하지 않습니다. (즉, 예를 들어 사용자 정의 값은 해당 점수에 연결된 값이 아닙니다.) 두 번째 해결책은 내가 찾고있는 것을 정확히 수행 한 것 같습니다. 덕분에 많은 감사를드립니다! – jsmars

+0

이와 같은 요청이 비정상적으로 느린 이유는 무엇입니까? 내가이 변경을 한 이후로 요청은 초 단위로 걸릴 수 있습니다. 다른 요청은 빠르게 처리됩니다. phpMyAdmin에서이 작업을 실행하는 데는 최대 1 분, 다른 작업에는 0.0002 초가 걸릴 수 있습니다. 데이터베이스에는 수천 개의 항목이 있습니다. – jsmars

+0

오래 걸리지 않아야합니다. 이름 열에 색인이 있습니까? 먼저 해봐. 여전히 느린 경우 점수 열에 색인을 추가하십시오. 내가 쿼리를 1 초 미만 걸릴 것으로 기대했다. – xagyg

0

여러 항목의 점수가 같기 때문에 여러 항목이 반환됩니다. LIMIT 1을 추가하면 단일 항목 만 얻을 수 있습니다. ORDER BY 절을 사용하여 반환 할 항목을 선택할 수 있습니다.

관련 문제