2017-12-28 23 views
0

MySQL 데이터베이스에 두 개의 테이블이 있습니다. 하나는 플레이어이고 다른 하나는 세계입니다. 각 플레이어는 "레벨"과 "세계"란을 가지고 있습니다. 달성하고자하는 것은 표 세계의 열을 표 플레이어의 열 값을 기준으로 채우는 것입니다. 우선 그 세계의 플레이어와 그 레벨의 평균을 구합니다.PHP/SQL - 다른 열의 합계를 받으십시오.

내 표는 다음과 같다 :

테이블 : 플레이어

+-------+-------+--------+----------+-------+--------------+---------+--------+ 
| id | name | sex | vocation | level | achievements | world | online | 
+-------+-------+--------+----------+-------+--------------+---------+--------+ 
| 24471 | John | Male | None  | 92 |   3 | Antica |  1 | 
| 24493 | Bob | Male | None  | 76 |   19 | Amera |  0 | 
| 24535 | Sam | Male | None  | 75 |   0 | Antica |  0 | 
| 24574 | Sarah | Female | None  | 78 |   23 | Beneva |  1 | 
| 24673 | Carl | Male | None  | 75 |   10 | Belobra |  1 | 
+-------+-------+--------+----------+-------+--------------+---------+--------+ 

테이블 : 세계는

+----+---------+---------+--------+--------+----------+---------------+--------------+ 
| id | name | players | online | avglvl | totalexp | location |  pvp  | 
+----+---------+---------+--------+--------+----------+---------------+--------------+ 
| 1 | Amera |  0 |  0 |  0 |  0 | North America | Open PvP  | 
| 2 | Antica |  0 |  0 |  0 |  0 | Europe  | Open PvP  | 
| 3 | Astera |  0 |  0 |  0 |  0 | North America | Optional PvP | 
| 4 | Belobra |  0 |  0 |  0 |  0 | South America | Optional PvP | 
| 5 | Beneva |  0 |  0 |  0 |  0 | Europe  | Optional PvP | 
+----+---------+---------+--------+--------+----------+---------------+--------------+ 

그래서 예를 들어, 우리가 볼 수있는 선수 세계를 가지고 Antica. 따라서 Antica는 테이블 세계의 플레이어 열 아래에서 값 "2"를 가져야합니다. 그러나 John은 Antica에서 온라인으로 접속하고 있습니다. 그래서 세계 Antica는 "world"테이블의 "online"열 아래에 "1"값을 가져야합니다. 등등. 나는 또한 그 세계에서 그들의 평균 수준을 원한다.

SQL 쿼리를 작성하여 PHP로 어떻게이 작업을 수행 할 수 있습니까?

처음에는 모든 세계 이름을 가져야합니다 (제 생각에는?). 그리고 각각의 세계를 위해 다음과 같은 세부 정보를 얻을 :

  • 플레이어 금액

  • 온라인 양

  • 평균 수준의 양

그리고 세계 테이블에 업데이트을 그 값을 ..

+1

귀하의 질문은 너무 광범위합니다. 시도한 것을 게시 할 수 있습니까? 실패했을 수 있습니다. 그렇게하면 최소한 당신의 노력을 보여줄 것입니다. –

답변

1

당신은 할 수 있습니다 로 데이터를 arize :

select world, count(*) as players, sum(online) as online, avg(level) as avglevel 
from players 
group by world; 

당신은 update에이를 통합 할 수 있습니다 :

update worlds w join 
     (select world, count(*) as players, sum(online) as online, avg(level) as avglevel 
     from players 
     group by world 
     ) p 
     on w.world = p.world 
    set w.players = p.player, 
     w.online = p.online, 
     w.avglevel = p.avglevel; 

나는 이것이 좋은 생각처럼 별도의 테이블을 유지 생각하지 않습니다. 결국이 정보를 얻기 위해 항상 players을 쿼리 할 수 ​​있습니다. 또한 두 시스템이 빨리 구식이 될 수 있으므로 데이터가 일치하지 않습니다. 트리거를 사용하여 문제를 해결할 수 있지만 시스템에 복잡성이 추가됩니다. 일반적으로 간단한 쿼리만으로 충분합니다.

+0

내 남자! 너 해결 했어! 어쨌든 이것을 위해 cron 작업을 사용할 예정이므로 절대로 구식이 될 수 없습니다. 정말 고맙습니다! 나는 너를 괴롭힌다 너를 사랑해, 친구! 방금 검색어에 약간의 오타가있는 것을 발견했지만 해결했습니다. 'on w.name = p.world'와'set w.players = p.players'이어야합니다. 너무 많이 sooooooooo 고마워! –

+0

@LeeCheung. . . cron 작업이 있더라도 테이블은 오래된 것입니다. 보기를 사용하는 것이 좋습니다.어떤 이유로이 표가 필요한 경우 트리거를 탐색해야 할 수 있습니다. –