Здравствуйте! Я начинающий пользователь функции "агрегация" модуля Views по этому сначала попробую объяснить что мне нужно на примере MySQL.
Имеем 1 огромную таблицу в которой содержаться все необходимые данные. Уникальный ключ этой таблицы сформирован на стадии импорта путем комбинации нескольких полей фала импорта.
Основные столбцы таблицы: id строки, имя спортсмена, результат показанный на соревнованиях, вес спортсмена, название соревнований.
Задача: выбрать строки в которых спортсмены показали личный рекорд
Решение:
1) сделать временную промежуточную таблицу в которой будет два поля: id строки, лучший результат спортсмена.
2) сделать выборку из основной таблицы на основе данных из промежуточной.
Теперь с чем я столкнулся в Views.
Проблема в том, что лучший результат для каждого спортсмена можно вывести используя только 2 поля по аналогии с промежуточной таблицей MySQL:
Но при добавлении дополнительных полей появляются дополнительные строки сгруппированные по дополнительным полям:
Вопрос: как сформировать таблицу отображающую максимальный результат для каждого спортсмена и отображающую дополнительные данные которые соответствуют лучшему результату (название соревнований, дата выступления и т.д.)?
Комментарии
Проверьте наличие связей, в настройках представления.
Покажите лучше SQL-запрос (в настройках представлений "admin/structure/views/settings" нужно включить отображение). Поможет понять что вызывает отображение доп. строк.
В целом, должна быть ~ такая структура: http://www.sqlfiddle.com/#!9/c6e2df0/1/0
Вы имеете ввиду связи в разделе "Расширенные"? Я их не включал т.к. все данные берутся из одного типа материала.
SQL-запрос с двумя полями (работает как ожидаю)
FROM
{node_field_data} node_field_data
LEFT JOIN {node__field_event} node__field_event ON node_field_data.nid = node__field_event.entity_id AND node__field_event.deleted = '0'
LEFT JOIN {node__field_equipment} node__field_equipment ON node_field_data.nid = node__field_equipment.entity_id AND node__field_equipment.deleted = '0'
LEFT JOIN {node__field_name} node__field_name ON node_field_data.nid = node__field_name.entity_id AND node__field_name.deleted = '0'
LEFT JOIN {node__field_ipfpoints} node__field_ipfpoints ON node_field_data.nid = node__field_ipfpoints.entity_id AND node__field_ipfpoints.deleted = '0'
WHERE (node_field_data.status = '1') AND (node_field_data.type IN ('openpowerliftingstring')) AND (node__field_event.field_event_value LIKE 'SBD' ESCAPE '\\') AND (node__field_equipment.field_equipment_value LIKE 'RAW' ESCAPE '\\') AND (node__field_name.field_name_value LIKE 'Aleksey Nikulin' ESCAPE '\\')
GROUP BY node__field_name_field_name_value
ORDER BY node__field_ipfpoints_field_ipfpoints_value DESC, node__field_name_field_name_value ASC
LIMIT 51 OFFSET 0
Запрос с 4 полями (проблемный)
FROM
{node_field_data} node_field_data
LEFT JOIN {node__field_event} node__field_event ON node_field_data.nid = node__field_event.entity_id AND node__field_event.deleted = '0'
LEFT JOIN {node__field_equipment} node__field_equipment ON node_field_data.nid = node__field_equipment.entity_id AND node__field_equipment.deleted = '0'
LEFT JOIN {node__field_name} node__field_name ON node_field_data.nid = node__field_name.entity_id AND node__field_name.deleted = '0'
LEFT JOIN {node__field_ipfpoints} node__field_ipfpoints ON node_field_data.nid = node__field_ipfpoints.entity_id AND node__field_ipfpoints.deleted = '0'
LEFT JOIN {node__field_bodyweightkg} node__field_bodyweightkg ON node_field_data.nid = node__field_bodyweightkg.entity_id AND node__field_bodyweightkg.deleted = '0'
LEFT JOIN {node__field_date} node__field_date ON node_field_data.nid = node__field_date.entity_id AND node__field_date.deleted = '0'
WHERE (node_field_data.status = '1') AND (node_field_data.type IN ('openpowerliftingstring')) AND (node__field_event.field_event_value LIKE 'SBD' ESCAPE '\\') AND (node__field_equipment.field_equipment_value LIKE 'RAW' ESCAPE '\\') AND (node__field_name.field_name_value LIKE 'Aleksey Nikulin' ESCAPE '\\')
GROUP BY node__field_bodyweightkg_field_bodyweightkg_value, node__field_date_field_date_value, node__field_name_field_name_value
ORDER BY node__field_ipfpoints_field_ipfpoints_value DESC, node__field_name_field_name_value ASC
LIMIT 51 OFFSET 0
Да, почему-то добавляется группировка по дате и весу, во 2м запросе.
У Вас, в настройках формата (таблицы) не установлены доп. группировки по этим полям?
Эти группировки добавляются автоматически при добавлении поля в представление. Я не знаю как их отключить.
Вот тут, я имею ввиду:
Там есть возможность вносить доп. групировку, что-то вроде такого:
Никаких доп. группировок не должно быть.
В этой настройке для группирующих полей стоит значение "Не указано".
Попробую обмозговать на досуге, что может приводить к доп. группировкам.
Буду признателен!
Сервис замечательный, отдельное спасибо!
Но в Вашем примере, если я правильно понимаю, для строки "(15, 'Name 3', 36, 70, 'Comp 6')" формируется "Name 3 36 70 Comp 2". Получается, что name, score, weight - попадают, а competition берется случайный.
Да, я понял в чем трабл, нужно выводить данные именно из строки с максимальным результатом.
Пока, удалось соорудить вот такой сниппет: http://www.sqlfiddle.com/#!9/dc8444/1/0
Но, в нем же, могут отображаться дубли, как понимаю из-за того что значения колонки для расчета максимального значения одинаковы: http://www.sqlfiddle.com/#!9/c6e2df0/19/0
Как воспроизвести в представлении, боюсь, подсказать не смогу. Во всяком случае чтоб без программного альтера запроса.
А что такое "программный алерт запроса"?
Подмена запроса для определенного представления.
Позволяет влиять на конечное выражение запроса к БД.
Реализуется имплементацией хука в кастомном модуле.