Сортировка в DocLister

Здравствуйте!
Коллеги, подскажите, в документации написано, что в параметр &orderBy:«Возможные значения — любая строка удовлетворяющая правилам построения параметра ORDER BY в SQL запросе.»

Если любая строка, то возможно ли поместить такой запрос в этот параметр для сортировки?
ORDER BY CHAR_LENGTH(rfrom) DESC


Пытался делать вот так
&orderBy=`CHAR_LENGTH(имя_параметра) ASC`

но ничего хорошего с этого не получалось. Как правильно это сделать, поместить SQL запрос в &orderBy? Предусмотрено ли это вообще?

14 комментариев

avatar
Так в чем проблема? Я успешно отсортировал по длине заголовка:

&orderBy=`CHAR_LENGTH(c.pagetitle) ASC`
avatar
проблема была в буковке «с.» Спасибо, теперь работает, но только если после c. идет pagetitle. Если ставлю ТВ-параметр — вообще выборка не срабатывает. Как tv-параметр правильно указать в запросе этом? В доке написано «Имена TV-параметров указываются как есть». Но если я указываю как есть, получаю вот что:
http://prntscr.com/g15wz1
Комментарий отредактирован 2017-07-27 22:34:35 пользователем Navin
avatar
Указываются как есть для простых случаев, типа &orderBy=`price ASC`. А так нужно посмотреть, какое получается в запросе имя поля и его подставлять. Или переопределить метод injectSortByTV.
avatar
А как посмотреть какое имя получается в запросе? Где? не могли бы вы подсказать? Не совсем сведущ в этом.
avatar
&orderBy=`tv DESC` &debug=`1`
avatar
Включая debug получаю parse error http://prntscr.com/g1bhjs
Блин, почему..?
Комментарий отредактирован 2017-07-28 09:05:25 пользователем Navin
avatar
Потому что нужно обновить доклистер.
avatar
Не могу понять, как в DocLister при &idType=`documents` отсортировать по TV-параметру «Цена».

EVO 1.4.5
PHP не влияет, пробовал 5.6 и 7.0
Версия DocLister не влияет, пробовал от 2.3.15 до 2.4.1

Вызов ДокЛистера:
[!DocLister? 
    &idType=`documents`
    &documents=`399,506,515,516,121,475`
    &ownerTPL=`@CODE:[+dl.wrap+]`
    &tpl=`@CODE:[+id+]  [+tv.price+]`
    &tvSortType=`UNSIGNED `
    &orderBy=`price ASC`	
    &tvList=`price`
    &debug=`1`
!]


Запрос получается такой:
SELECT 
  c.* 
FROM 
  здесь_имя_базы.`modx_site_content` as `c` 
  LEFT JOIN hordveri.`modx_site_tmplvar_contentvalues` as `dltv_price_1` on `dltv_price_1`.`contentid` = `c`.`id` 
  AND `dltv_price_1`.`tmplvarid` = 4 
WHERE 
  c.id IN (
    '399', '506', '515', '516', '121', '475'
  ) 
  AND c.deleted = 0 
  AND c.published = 1 
ORDER BY 
  CAST(
    `dltv_price_1`.`value` as UNSIGNED
  ) ASC


Результат:


Если этот же запрос напрямую в PMA исполнить — результат тот же.

Причем изменение &tvSortType на результат не влияет. Но если вторую цифру в цене 22600 исправить на 1, то есть сделать 21600 — тогда сортируется нормально.

Что-то я уже затупил…
avatar
Какой-то подозрительный and перед where. А что, если его в запросе передвинуть перед order?:) и да, имя базы в этом запросе мы таки видим)))
Комментарий отредактирован 2018-12-28 20:24:16 пользователем webber
avatar
и да, имя базы в этом запросе мы таки видим)))
:D я уже был в состоянии нирваны, не заметил )))

Пример запроса был с ДокЛистером 2.3.15.

Я снова обновил DocLister до 2.4.1, и запрос приобрел чуть другой вид, в нём появилось GROUP BY, но результат не изменился.
SELECT 
  c.* 
FROM 
  hordveri.`modx_site_content` as `c` 
  LEFT JOIN hordveri.`modx_site_tmplvar_contentvalues` as `dltv_price_1` on `dltv_price_1`.`contentid` = `c`.`id` 
  AND `dltv_price_1`.`tmplvarid` = 4 
WHERE 
  c.id IN (
    '399', '506', '515', '516', '121', '475'
  ) 
  AND c.deleted = 0 
  AND c.published = 1 
GROUP BY 
  `c`.`id` 
ORDER BY 
  CAST(
    `dltv_price_1`.`value` as UNSIGNED
  ) ASC


Затем я передвинул AND `dltv_price_1`.`tmplvarid` = 4 перед GROUP BY и исполнил запрос напрямую в PMA — ничего не поменялось.

MySQL был 5.5. Поменял на MySQL 5.6 — результат тот же.
Комментарий отредактирован 2018-12-29 01:28:30 пользователем Aharito
avatar
Запрос правильный, у меня работает — так что проблема либо с данными либо с БД :)
А если сделать просто запрос к таблице тв с такой же сортировкой?
SELECT * FROM modx_site_tmplvar_contentvalues dltv_price_1 WHERE dltv_price_1.contentid IN ('399', '506', '515', '516', '121', '475') AND dltv_price_1.tmplvarid=4 ORDER BY CAST(dltv_price_1.value as UNSIGNED) ASC
avatar
А если сделать просто запрос к таблице тв с такой же сортировкой?


Благодарю за идею! вылезла непонятная для меня хрень — в таблице site_tmplvar_contentvalues дубль по contentid… не совсем понимаю — как такое могло получиться?



Буду разбираться.
avatar
Насколько я помню, связка tmplvarid-contentid должна иметь ключ уникальный. Возможно, при обновлении он не создался
avatar
Понял, буду дальше копать, благодарю.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.