Переписать group-by через произвольно упорядоченный подзапрос, используя только один выбор

Вот вещь У меня 3 таблицы, и я делаю этот запрос:

select t.nomefile, t.tipo_nome, t.ordine
from
(select nomefile, tipo_nome, categorie.ordine
from t_gallerie_immagini_new as immagini
join t_gallerie_new as collezioni on collezioni.id=immagini.id_ref
join t_gallerie_tipi as categorie on collezioni.type=categorie.id
order by RAND()
) as t
group by t.tipo_nome
order by t.ordine

Он применяется к 3 таблицам, все в отношении 1-N, которые необходимо объединить, а затем взять 1 случайный результат из каждого другого результата в таблице более высокого уровня. Этот запрос работает нормально, проблема в том, что меня просят переписать этот запрос, используя только один выбор. Я пришел с другим способом сделать это только с одним выбором, дело в том, что в соответствии с синтаксисом SQL, GROUP BY должен быть перед ORDER BY, поэтому бессмысленно упорядочивать случайным образом, когда у вас уже есть только первая запись для каждого значение в таблице более высокого уровня.

Кто-то знает, как написать этот запрос, используя только один выбор?

2 ответа

Решение

Я не смог понять причины запроса на переписывание этого запроса, однако я обнаружил, что существует решение, которое использует слово "выбрать" только один раз. Вот запрос:

SELECT g.type, SUBSTRING_INDEX(GROUP_CONCAT(
i.nomefile ORDER BY
RAND()),',',1) nomefile
FROM t_gallerie_new g JOIN t_gallerie_immagini_new i ON g.id=i.id_ref
GROUP BY g.type;

для всех, кто интересуется этим вопросом.

ПРИМЕЧАНИЕ. Использование GROUP_CONCAT имеет несколько недостатков: не рекомендуется использовать это ключевое слово при использовании средних / больших таблиц, так как это может увеличить полезную нагрузку на стороне сервера. Кроме того, существует ограничение на размер строки, возвращаемой GROUP_CONTACT, по умолчанию 1024, поэтому необходимо изменить параметр на сервере mySql, чтобы иметь возможность получать строку большего размера из этой инструкции.

Как правило, если я не сильно ошибаюсь, ORDER BY Предложение в подзапросе запроса, подобного этому, связано с техникой, которая позволяет извлекать столбцы не-GROUP BY (во внешнем запросе) в указанном порядке. И поэтому вам может не повезти, потому что это означает, что подзапрос важен для этого запроса.

Ну, потому что в данном конкретном случае выбранный порядок BY RAND() а не по конкретному столбцу / набору столбцов, вы можете получить очень грубый эквивалент, выполнив и объединения, и группирование на одном уровне, например:

select nomefile, tipo_nome, categorie.ordine
from t_gallerie_immagini_new as immagini
join t_gallerie_new as collezioni on collezioni.id=immagini.id_ref
join t_gallerie_tipi as categorie on collezioni.type=categorie.id
group by tipo_nome
order by categorie.ordine

Вы должны понимать, однако, почему это не является точным эквивалентом. Дело в том, что MySQL позволяет извлекать столбцы, отличные от GROUP BY, в запросе GROUP BY, но если они не соотнесены со столбцами GROUP BY, возвращаемые значения будут... нет, не случайны, используется термин по мануалу неопределенна. С другой стороны, методика, упомянутая в первом абзаце, использует тот факт, что если набор строк упорядочен явно и однозначно до группировки, то значения столбцов, не входящих в GROUP BY, всегда будут одинаковыми*. Таким образом, неопределенность связана с тем фактом, что "обычно" строки не упорядочиваются явно перед группировкой.

Теперь вы можете увидеть разницу. Оригинальная версия упорядочивает строки явно. Даже если это BY RAND()Это сделано специально, чтобы обеспечить (насколько это возможно) разные результаты в большинстве случаев. Но измененная версия "лишена" явного порядка, и поэтому вы, вероятно, получите идентичные результаты для многих выполнений подряд, даже если они являются "случайными".

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

* Техника, кстати, не может быть хорошо документирована и может быть найдена скорее эмпирически, чем в следующих руководствах.

Другие вопросы по тегам