2015-01-26 2 views
0

데이터베이스에 3 개의 테이블이 있고 하나의 테이블에서 모든 행을 선택하고 열 두 테이블의 합계와 함께 조인 한 다음 그 합계로 주문하는 쿼리를 수행해야합니다 . 테이블은 게임을위한 것입니다. 팀 테이블, 사용자가 유일하고 users.team_id = teams.id 열이있는 팀에 할당 된 사용자 테이블 및 마지막으로 각 사람이 하루에 수집하는 항목 인 항목 테이블이 있습니다. 사람은 매일 수집 된 항목 수를 입력 한 다음 합계를 계산합니다. items 테이블은 users.adid = items.user_id로 결합됩니다.MySQL의 다중 테이블 선택 SUM 쿼리

내가 필요한 것은 2015 년 이내에 날짜가있는 팀으로 제한된 모든 팀 목록을 제공 한 다음 여러 팀을 가질 수있는 각 팀에서 수집 한 항목의 합계에 대한 열을 갖도록하는 선택 쿼리입니다 회원. 이것은 모두 최대 항목부터 최소 항목 순으로 정렬됩니다.

예 :

| Team ID | Team Name | Total Items | 
------------------------------------- 
| 1  | Bravo  | 5674  | 
| 567  | Charlie | 16   | 

내가 MySQL을 SUM()하지만를 사용하여 시도 내가 가진 된 문제는 조인이, 나 중첩 된 쿼리에 의해 그룹이 합계를 얻기 위해 필요하다는 것이다 각 팀의 각 사용자 항목 수

테이블 구조 :이 트릭해야

CREATE TABLE `teams` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(100) NOT NULL DEFAULT '', 
    `captain_id` varchar(11) NOT NULL DEFAULT '', 
    `date` datetime NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `users` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `team_id` int(11) NOT NULL, 
    `adid` varchar(12) NOT NULL DEFAULT '', 
    `email` varchar(100) NOT NULL DEFAULT '', 
    `first_name` varchar(100) DEFAULT '', 
    `last_name` varchar(100) DEFAULT '', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `ADID` (`adid`), 
    UNIQUE KEY `email` (`email`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `items` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `user_id` varchar(11) NOT NULL DEFAULT '0', 
    `items` int(3) NOT NULL DEFAULT '0', 
    `date` datetime NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
+0

'SUM()'을 사용하여 모든 것을 시도 했습니까? http://www.mysqltutorial.org/mysql-sum/ –

+0

@ Fred-ii- 그렇습니다 저는 합계를 실험 해 왔습니다. 문제는 내가 뭔가를 두 테이블의 합계를 선택해야합니다 그래서 내가 그룹에 의해 조인 또는 문제를 제기 중첩 된 쿼리를해야합니다. – dpegasusm

+0

당신이 시도한 것과 실패한 것을 게시 할 수 있습니다. 다른 사람들은 오류가 발생한 곳을 지적 할 수 있습니다. –

답변

0
select t.id, t.name, t.total 
from teams t 
inner join users u on t.id = u.team_id 
inner join (select user_id, sum(items) as total 
      from items 
      where date >= '2015-01-01' 
       and date < '2016-01-01' 
      group by user_id) t on t.user_id = u.id 
      order by t.total desc; 
0

: 내가 항목 테이블에있는 것을보고

SELECT t.id, t.name, sum(i.items) as totalItems /* you will get 3 columns as result: "id", "name" and "totalItems" */ 
FROM teams t /* start selecting from the table "teams"... */ 
    INNER JOIN users u ON u.team_id = t.id /* ... join the users table ... */ 
    INNER JOIN items i ON i.user_id = u.adid /* ... and last but not least the items table */ 
WHERE year(t.date) = 2015 /* filter the teams by year */ 
GROUP BY t.id /* group the result by team id - you want just one line per team */ 
ORDER BY totalItems DESC /* order by total items */ 

또한 날짜입니다 - 당신이 그것을 필터링하려면 또한 올해도이 작업을 수행하십시오.

SELECT t.id, t.name, sum(i.items) as totalItems /* you will get 3 columns as result: "id", "name" and "totalItems" */ 
FROM teams t /* start selecting from the table "teams"... */ 
    INNER JOIN users u ON u.team_id = t.id /* ... join the users table ... */ 
    INNER JOIN items i ON i.user_id = u.adid AND year(i.date) = 2015 /* ... and last but not least the items table (and filter by year) */ 
WHERE year(t.date) = 2015 /* filter the teams by year */ 
GROUP BY t.id /* group the result by team id - you want just one line per team */ 
ORDER BY totalItems DESC /* order by total items */ 

그는 사용자 테이블이있는 항목 테이블입니다. 현재 varchar (users.adid가있는 items.user_id)와 함께 int에 가입하고 있습니다. 왜 items.user_id를 users.id에 가입시키지 않습니까? 그게 가능하지 않으면, 나는 int로 varchar에서 adid 전환하는 것이 좋습니다.