2013-09-03 3 views
0

У меня есть три основных таблицы в этом сценарии: leage_ladders, league_squads и league_experience. В настоящее время я работаю над страницей просмотра лестницы и хотел бы найти все отряды на данной лестнице, у которой есть опыт. Запрос не возвращает никаких ошибок, однако он возвращает только одну строку, и я понятия не имею, почему.Почему мой запрос возвращает только одну строку?

Ниже запрос я использую:

$query_squads = " 
      SELECT 
       s.squad_id AS squad_id, s.ladder_id, s.team_id AS team_id, 
       x.experience_id, x.squad_id, SUM(x.value) as total_exp 
      FROM league_squads AS s 
      LEFT JOIN league_experience AS x ON (s.squad_id = x.squad_id) 
      WHERE s.ladder_id = ".$ladder_id." 
      HAVING total_exp > 0 
      ORDER BY total_exp DESC 
      "; 

Ниже приведены мои таблицы:

-- 
-- Table structure for table `league_experience` 
-- 

CREATE TABLE IF NOT EXISTS `league_experience` (
    `experience_id` int(15) NOT NULL, 
    `squad_id` int(15) NOT NULL, 
    `value` int(15) NOT NULL, 
    `date_earned` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `description` varchar(255) NOT NULL, 
    PRIMARY KEY (`experience_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

-- 
-- Dumping data for table `league_experience` 
-- 

INSERT INTO `league_experience` (`experience_id`, `squad_id`, `value`, `date_earned`, `description`) VALUES 
(1, 1, 500, '2013-09-03 07:10:59', 'For being ballers.'), 
(2, 2, 250, '2013-09-03 07:10:52', 'For being awesome.'); 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `league_squads` 
-- 

CREATE TABLE IF NOT EXISTS `league_squads` (
    `squad_id` int(15) NOT NULL AUTO_INCREMENT, 
    `team_id` int(15) NOT NULL, 
    `ladder_id` int(15) NOT NULL, 
    `date_joined` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `status` tinyint(1) NOT NULL, 
    `last_rank` tinyint(5) NOT NULL, 
    PRIMARY KEY (`squad_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; 

-- 
-- Dumping data for table `league_squads` 
-- 

INSERT INTO `league_squads` (`squad_id`, `team_id`, `ladder_id`, `date_joined`, `status`, `last_rank`) VALUES 
(1, 1, 1, '2013-09-02 09:43:53', 0, 0), 
(2, 2, 1, '2013-09-03 06:14:49', 0, 0); 

Запрос должен возвращать два результата при ladder_id 1 посещается. Но он отображает только первый результат.

ответ

0

Поскольку вы используете агрегатную функцию SUM() без GROUP BY. Что он делает, так это вычисляет общую сумму всех отфильтрованных записей и возвращает случайное значение для неагрегированного столбца. Попробуйте добавить GROUP BY пункт,

WHERE ... 
GROUP BY s.squad_id, s.ladder_id, s.team_idd, x.experience_id, x.squad_id 
ORDER BY ... 

Согласно MySQL Docs,

Если вы используете функцию в заявлении группы, не содержащей GROUP BY п, это эквивалентно группировке на всех строках. Дополнительную информацию см. Section 12.15.3, MySQL Extensions to GROUP BY.

+0

А, да. Спасибо. Поскольку вы были первыми, кто действительно опубликовал решение, ваш ответ будет принят, как только он позволит мне! – ShoeLace1291

0

У вас есть функция агрегации в выбранной вами части: SUM(x.value) as total_exp. И поскольку нет GROUP BY, вы получите одну строку с суммой total_exp совпадающих строк.

0

Это потому, что вы используете агрегирующую функцию:

SUM(x.value) as total_exp 

который автоматически группы строк. И поскольку вы не указали GROUP BY, он группирует все строки вместе.

0

есть, вы использовали SUM() агрегация функция.

Я исправил ваш SQL.

SELECT 
s.squad_id AS squad_id, s.ladder_id, s.team_id AS team_id, 
x.experience_id, x.squad_id, SUM(x.value) as total_exp 
FROM league_squads AS s 
LEFT JOIN league_experience AS x ON (s.squad_id = x.squad_id) 
WHERE s.ladder_id = "1" 
GROUP BY s.squad_id, s.ladder_id, s.team_id, x.experience_id 
ORDER BY s.squad_id DESC 

Я просто вставлю 1 строку. для уточнения. он определяет, что для СУММ(). конечно, вы можете изменить эти условия.

GROUP BY s.squad_id, s.ladder_id, s.team_id, x.experience_id 

спасибо.

Смежные вопросы