Codeigniter: выбор суммы сумм дает результаты SUM times GROUP_CONCAT? - PullRequest
2 голосов
/ 14 марта 2012

Я запрашиваю четыре таблицы (а именно: resources, tag_list, resource_tags и voice) и пытаюсь получить список ресурсов, где каждый элемент списка имеет сгруппированные теги и сумму голосов для этого ресурса.

Это моя текущая модель:

$this->db->select('*');
$this->db->select('GROUP_CONCAT(DISTINCT tag SEPARATOR " | ") AS tags, SUM(vote) AS sumvotes');
$this->db->from('resources');
$this->db->join('resource_tags', 'resources.r_id = resource_tags.resource_id', 'left');
$this->db->join('tag_list', 'tag_list.t_id = resource_tags.tag_id', 'left');
$this->db->join('votes', 'votes.resource_id = resources.r_id', 'left');
$this->db->where('resources.published', '1');   
$this->db->group_by('resources.r_id'); 
$this->db->order_by('votes.vote', 'desc');
$query = $this->db->get();

Редактировать: вот необработанный SQL

SELECT *, GROUP_CONCAT(DISTINCT tag SEPARATOR " | ") AS tags, SUM(vote) AS sumvotes
FROM (`olu_resources`)
LEFT JOIN `olu_resource_tags` ON `olu_resources`.`r_id` = `olu_resource_tags`.`resource_id`
LEFT JOIN `olu_tag_list` ON `olu_tag_list`.`t_id` = `olu_resource_tags`.`tag_id`
LEFT JOIN `olu_votes` ON `olu_votes`.`resource_id` = `olu_resources`.`r_id`
WHERE `olu_resources`.`published` =  '1'
GROUP BY `olu_resources`.`r_id`
ORDER BY `olu_votes`.`vote` desc 

Кажется, что он делает все, кроме вычисления правильного количества голосов, он возвращает количество голосов, умноженных на количество тегов, которое имеет элемент. Кто-нибудь знает, почему это происходит? Или как исправить этот запрос?

1 Ответ

0 голосов
/ 14 марта 2012

Почему вы не используете подзапрос, чтобы получить голоса?Active Record в CI отлично подходит для простых запросов, но сложный (и медленный), когда у вас есть более сложные запросы, такие как ваш.

Возможно, все возможно с Active Record, хотя я сначала проверю профилировщик и посмотрю наразница в скорости.В прошлый раз, когда я сделал что-то подобное, это дало 7 секунд.Я бы попробовал что-то вроде этого:

$SQL = "SELECT *, GROUP_CONCAT(DISTINCT tag SEPARATOR ' | '),
(SELECT SUM(vote) FROM olu_votes WHERE olu_votes.resource_id = olu_resources.r_id) AS sumvotes
FROM (olu_resources)
LEFT JOIN olu_resource_tags ON olu_resources.r_id = olu_resource_tags.resource_id
LEFT JOIN olu_tag_list ON olu_tag_list.t_id = olu_resource_tags.tag_id
LEFT JOIN olu_votes ON olu_votes.resource_id = olu_resources.r_id
WHERE olu_resources.published =  '1'
GROUP BY olu_resources.r_id
ORDER BY olu_votes.vote desc"

$this->db->query($SQL);

Надеюсь, это также решит вашу проблему.Дайте мне знать, если это работает!при необходимости я создам тестовый запрос в моей собственной системе, чтобы получить желаемый результат.

...