#sql #postgresql #conditional-statements
#sql #postgresql #условные операторы
Вопрос:
Как установить условие в поле last_order, где последний порядок — это настраиваемое поле, созданное функцией max sql и группируемое по идентификатору пользователя :
SELECT "users"."id", "users"."name", "users"."email", "users"."type", "users"."created_at", MAX(TO_CHAR(order_details.created_at, 'YYYY-MM-dd HH24:MM')) AS last_order
FROM "users"
LEFT JOIN "order_details" on "order_details"."user_id" = "users"."id"
WHERE EXISTS (
SELECT *
FROM "roles"
LEFT JOIN "role_users" on "roles"."id" = "role_users"."role_id"
WHERE "role_users"."user_id" = "users"."id" and "slug" = 'member'
) AND "users"."status" in (0)
AND (LOWER(CAST("users"."id" as TEXT)) LIKE '%%'
OR LOWER(CAST("email" as TEXT)) LIKE '%%'
OR LOWER(CAST("last_order" as TEXT)) LIKE '%%'
OR LOWER(CAST("name" as TEXT)) LIKE '%%')
GROUP BY "users"."id"
ORDER BY "created_at" desc
Я всегда получаю эту ошибку:
column "last_order" does not exist
Как использовать last_order?? я уже проверяю его по правильному псевдониму.
Этот запрос, сгенерированный таблицами данных, причиной ошибки является то, что я использовал псевдоним для функции поиска datatables, мой код datatables, как показано ниже:
columns: [
{ data: 'id', name: 'users.id', class: 'text-center', orderable: false },
{ data: 'email', name: 'email' },
{ data: 'last_order', name: 'last_order', class: 'text-center', orderable: true },
{ data: 'name', name: 'name' },
]
Комментарии:
1. Потому что вы не можете использовать псевдоним в
where
предложении. Кстати, вы не группируете по большому количеству столбцов, которые вы тоже не агрегируете2. @juergend Итак, как включить максимальное поле функции в предложение where?
3. Используйте
having
предложение
Ответ №1:
Две проблемы:
- Вы не можете использовать псевдонимы столбцов
select
, определенные вwhere
предложении in. - Вы не можете использовать функции агрегирования в
where
предложении.
Переместите условие в having
предложение:
. . .
GROUP BY "users"."id"
HAVING LOWER(CAST(last_order as TEXT)) LIKE '%%'
ORDER BY "created_at" desc
Я предполагаю, что ваши like
шаблоны на самом деле более интересны, чем '%%'
. И вы не должны использовать like
для столбцов даты / времени. Просто используйте соответствующие сравнения равенства / диапазона или сравнения для частей даты.
Комментарии:
1. И postgres, вероятно, выдает ошибку, если выбранные столбцы не входят в предложение group by
2. @juergend . . . Postgres функционально поддерживает (необязательно) стандарт ANSI, который позволяет использовать функционально зависимые столбцы в
GROUP BY
, так что это не проблема, если предположить, чтоusers.id
это уникально.3. @GordonLinoff Да, это верно, но моя проблема в том, что этот запрос генерируется таблицами данных, когда я использую таблицу поиска, запрос просто такой, поэтому я не могу изменить оператор запроса, единственное, что мне нужно, это то, как я использую псевдоним при условии where или изменяю столбец datatablesимя.
4. @GordonLinoff и я пытаемся использовать having, результат тот же «столбец «last_order» не существует»