Это неудобный запрос. Одним словом, вам нужно ИЛИ потенциальных строк, а затем вычислить верхнюю строку наборов результатов, упорядоченных по case when locale = 'it' then 1 when ... end
. Есть много способов получить правильный результат (в частности, функции окна), но, честно говоря, вы действительно не хотите идти туда по соображениям производительности.
Methinks пересмотреть свои предположения или изменить схему.
Одним из способов сделать это достаточно быстро является добавление столбца массива к новостям, например. languages
, который поддерживается триггером. Отфильтруйте верхние новости (что я предполагаю, это то, что вы извлекаете), используя это вместо объединения с переводами. (Примечание: в зависимости от вашей версии Postgres избегайте добавления индекса GIST в этот столбец, поскольку избирательность оператора &&
была жестко запрограммирована и превзошла бы порядок заказа/limit/offset, используя btree за пределами определенной строки.)
Другой способ сделать это достаточно быстрым - отслеживать отдельную таблицу подач на каждый язык - в основном материализованное представление, которое дает идентификаторы запроса, который вы пытаетесь построить.
Любой вариант, как вы видите, представляет собой частичное или полное предварительное вычисление строк, которые будут отображаться для каждого языка. Первый подход со столбцом массива отлично работает в моем собственном опыте - мне нравится использовать его для тегов, для ускорения и/или фильтрации.
Эти вопросы гораздо проще адресовать, если вы предоставили sqlfiddle, показывающий таблицу и текущий запрос, наряду с желаемым результатом. – gwaigh