Проблема с агрегацией во Views без использования связей (промежуточной таблицы)

Главные вкладки

Аватар пользователя Gnom7 Gnom7 6 января 2020 в 2:44

Здравствуйте! Я начинающий пользователь функции "агрегация" модуля Views по этому сначала попробую объяснить что мне нужно на примере MySQL.

Имеем 1 огромную таблицу в которой содержаться все необходимые данные. Уникальный ключ этой таблицы сформирован на стадии импорта путем комбинации нескольких полей фала импорта.

Основные столбцы таблицы: id строки, имя спортсмена, результат показанный на соревнованиях, вес спортсмена, название соревнований.

Задача: выбрать строки в которых спортсмены показали личный рекорд

Решение:
1) сделать временную промежуточную таблицу в которой будет два поля: id строки, лучший результат спортсмена.
2) сделать выборку из основной таблицы на основе данных из промежуточной.

Теперь с чем я столкнулся в Views.
Проблема в том, что лучший результат для каждого спортсмена можно вывести используя только 2 поля по аналогии с промежуточной таблицей MySQL:


Но при добавлении дополнительных полей появляются дополнительные строки сгруппированные по дополнительным полям:

Вопрос: как сформировать таблицу отображающую максимальный результат для каждого спортсмена и отображающую дополнительные данные которые соответствуют лучшему результату (название соревнований, дата выступления и т.д.)?

Комментарии

Аватар пользователя bumble bumble 6 января 2020 в 4:43
1

Проверьте наличие связей, в настройках представления.

Покажите лучше SQL-запрос (в настройках представлений "admin/structure/views/settings" нужно включить отображение). Поможет понять что вызывает отображение доп. строк.

В целом, должна быть ~ такая структура: http://www.sqlfiddle.com/#!9/c6e2df0/1/0

Аватар пользователя Gnom7 Gnom7 6 января 2020 в 5:56

Вы имеете ввиду связи в разделе "Расширенные"? Я их не включал т.к. все данные берутся из одного типа материала.

SQL-запрос с двумя полями (работает как ожидаю)

SELECT node__field_name.field_name_value AS node__field_name_field_name_value, MAX(node__field_ipfpoints.field_ipfpoints_value) AS node__field_ipfpoints_field_ipfpoints_value, MAX(node__field_ipfpoints.delta) AS node__field_ipfpoints_delta, MAX(node__field_ipfpoints.langcode) AS node__field_ipfpoints_langcode, MAX(node__field_ipfpoints.bundle) AS node__field_ipfpoints_bundle, MIN(node_field_data.nid) AS nid
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 полями (проблемный)

SELECT node__field_bodyweightkg.field_bodyweightkg_value AS node__field_bodyweightkg_field_bodyweightkg_value, node__field_date.field_date_value AS node__field_date_field_date_value, node__field_name.field_name_value AS node__field_name_field_name_value, MAX(node__field_ipfpoints.field_ipfpoints_value) AS node__field_ipfpoints_field_ipfpoints_value, MAX(node__field_ipfpoints.delta) AS node__field_ipfpoints_delta, MAX(node__field_ipfpoints.langcode) AS node__field_ipfpoints_langcode, MAX(node__field_ipfpoints.bundle) AS node__field_ipfpoints_bundle, MIN(node_field_data.nid) AS nid
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
Аватар пользователя bumble bumble 6 января 2020 в 6:07

Да, почему-то добавляется группировка по дате и весу, во 2м запросе.
У Вас, в настройках формата (таблицы) не установлены доп. группировки по этим полям?

Аватар пользователя Gnom7 Gnom7 6 января 2020 в 6:14

Эти группировки добавляются автоматически при добавлении поля в представление. Я не знаю как их отключить.

Аватар пользователя bumble bumble 6 января 2020 в 6:17
1

Вот тут, я имею ввиду:

Там есть возможность вносить доп. групировку, что-то вроде такого:

Никаких доп. группировок не должно быть.

Аватар пользователя Gnom7 Gnom7 6 января 2020 в 6:10

В целом, должна быть ~ такая структура: http://www.sqlfiddle.com/#!9/c6e2df0/1/0

Сервис замечательный, отдельное спасибо!
Но в Вашем примере, если я правильно понимаю, для строки "(15, 'Name 3', 36, 70, 'Comp 6')" формируется "Name 3 36 70 Comp 2". Получается, что name, score, weight - попадают, а competition берется случайный.

Аватар пользователя bumble bumble 6 января 2020 в 6:23

Да, я понял в чем трабл, нужно выводить данные именно из строки с максимальным результатом.

Пока, удалось соорудить вот такой сниппет: http://www.sqlfiddle.com/#!9/dc8444/1/0
Но, в нем же, могут отображаться дубли, как понимаю из-за того что значения колонки для расчета максимального значения одинаковы: http://www.sqlfiddle.com/#!9/c6e2df0/19/0

Как воспроизвести в представлении, боюсь, подсказать не смогу. Во всяком случае чтоб без программного альтера запроса.

Аватар пользователя bumble bumble 6 января 2020 в 6:39
1

Подмена запроса для определенного представления.

Позволяет влиять на конечное выражение запроса к БД.

Реализуется имплементацией хука в кастомном модуле.