Вопрос

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

PGError: ERROR:  column "l_user_id" does not exist
LINE 1: ...t_id where l.user_id = 8 order by l2.geopoint_id, l_user_id ...
                                                             ^

...запрос:

   select distinct 
          l2.*, 
          l.user_id as l_user_id, 
          l.geopoint_id as l_geopoint_id 
     from locations l 
left join locations l2 on l.geopoint_id = l2.geopoint_id 
    where l.user_id = 8 
 order by l2.geopoint_id, l_user_id = l2.user_id desc

предложение "l.user_id как l_user_id, l.geopoint_id как l_geopoint_id" было добавлено, потому что, по-видимому, postgres не любит предложения order с не выбранными полями.Но ошибка, которую я сейчас получаю, создает впечатление, что я также не получаю псевдонимов.Кто-нибудь, имеющий опыт работы с postgres, видит проблему?

Вероятно, у меня возникнет куча таких проблем - запросы отлично работали в MySQL...

Это было полезно?

Решение

В PostgreSQL вы не можете использовать выражение с псевдонимом в order by.Там работают только простые псевдонимы.Ваш запрос должен выглядеть следующим образом:

   select distinct 
          l2.*, 
          l.user_id as l_user_id, 
          l.geopoint_id as l_geopoint_id 
     from locations l 
left join locations l2 on l.geopoint_id = l2.geopoint_id 
    where l.user_id = 8 
 order by l2.geopoint_id, l.user_id = l2.user_id desc;

Я полагаю, вы имеете в виду, что l2.user_id=l.user_id нужно идти первым.

Это актуальное сообщение в PostgreSQL-общий список рассылки.Следующее находится в документация по ORDER BY оговорка:

Каждое выражение может быть имя или порядковый номер вывод столбец (ВЫБЕРИТЕ элемент списка), или это может быть произвольное выражение, сформированное из входной столбец ценности.

Таким образом, никаких псевдонимов при использовании выражения.

Другие советы

У вас есть:

order by l2.geopoint_id, l_user_id = l2.user_id desc

в вашем запросе.Это незаконный синтаксис.Удалите = l2.user_id часть (переместите ее в where если это одно из условий объединения), и это должно сработать.

Обновить Ниже выберите (с = l2.user_id удалено) должно работать просто отлично.Я протестировал это (очевидно, с другими названиями таблиц / столбцов) на Postgres 8.3

select distinct 
       l2.*, 
       l.user_id as l_user_id, 
       l.geopoint_id as l_geopoint_id 
  from locations l 
  left join locations l2 on l.geopoint_id = l2.geopoint_id 
 where l.user_id = 8 
 order by l2.geopoint_id, l_user_id desc

Я столкнулся с этой же проблемой, используя функции из fuzzystrmatch - в частности, функцию Левенштейна.Мне нужно было как выполнить сортировку по расстоянию между строками, так и отфильтровать результаты по расстоянию между строками.Изначально я пытался:

SELECT thing.*, 
levenshtein(thing.name, '%s') AS dist 
FROM thing 
WHERE dist < character_length(thing.name)/2 
ORDER BY dist

Но, конечно, я получил сообщение об ошибке "столбец "dist" не существует" из предложения WHERE.Я попробовал это, и это сработало:

SELECT thing.*, 
(levenshtein(thing.name, '%s')) AS dist 
FROM thing 
ORDER BY dist

Но мне нужно было иметь это уточнение в предложении WHERE.Кто-то еще в этом вопросе сказал, что предложение WHERE оценивается перед ORDER BY , таким образом, столбец не существовал, когда он оценивал предложение WHERE .Следуя этому совету, я выяснил, что вложенный оператор SELECT делает свое дело:

SELECT * FROM 
(SELECT thing.*, 
     (levenshtein(thing.name, '%s')) AS dist 
     FROM thing 
     ORDER BY dist
) items 
WHERE dist < (character_length(items.name)/2)

Обратите внимание, что требуется псевдоним таблицы "элементы", а псевдоним столбца dist доступен во внешнем SELECT, поскольку он уникален в инструкции.Это немного обалденно, и я удивлен, что в PG все должно быть именно так, но, похоже, это не повлияло на производительность, так что я доволен.

"был добавлен, потому что, по-видимому, postgres не любит предложения order с не выбранными полями"

"Что касается порядка по - да, PostgreSQL (и многие другие базы данных) не допускают порядок по столбцам, которых нет в предложении select".

Просто напросто неправда.

=> ВЫБЕРИТЕ идентификатор ИЗ ЗАКАЗА t1 ПО ЛИМИТУ владельца 5;

ID

30 10 20 50 40 (5 рядов)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top