2

Я пытался ответить this question, где я получил эту проблему.Rails 3 Запрос: получение ошибки при использовании 'select' with 'order'

У меня есть модель пользователя, имеющая id, email и first_name столбцы. Поэтому в одном запросе я хочу выбрать пользователей с отличным first_name, сортировать их по email и выщипывать их ID.

Как я могу это сделать?

, что не будет работать:

  1. User.select(:first_name).uniq.pluck(:id)

    , потому что он запускает этот SQL SELECT DISTINCT "users"."id" FROM "users". Это выбор отдельного идентификатора пользователя. Но мы хотим, чтобы выбирать различный First_name

  2. User.order("email DESC").pluck(:id).uniq

    SQL сгенерированы: SELECT "users"."id" FROM "users" ORDER BY email DESC. Это не сработает, потому что сгенерированный sql не проверяет уникальность first_name.

+0

Я подозреваю, что этот выбор выбирает ячейку, но не строку – asdjkag

+0

. Ваше требование необоснованно. Если вы выделяете first_name, вы должны получить много идентификаторов от одного first_name вместо одного id. –

ответ

2

Вы можете протестировать SQL с помощью этого SQLFIDDLE.

Только Sqlite и MySql поддерживают это использование, а другие нет.

См. Это postgresql document.

В стандарте SQL-92, заказ по статье можно использовать только имена столбцов в результате или номер

Также можно использовать произвольные выражения в ORDER BY предложения, включая столбцы, которые не отображаются в список результатов SELECT. Таким образом, имеет место следующее заявление:

ВЫБЕРИТЕ имя ОТ дистрибьюторов ЗАКАЗАТЬ ПО кодом;

Ограничение этого признака является то, что заказ по п применении к результату в объединение, пересечение, или за исключением пункта можно указать только имя выходного столбца или номер, не выражение.

В вашем случае, нет необходимости в использовании Uniq, все идентификатор пользователя отчетливое уже, так почему бы вам не попробовать это:

User.order("email DESC").pluck(:id) 

Предполагая Идентификаторы дублируются, вы можете Uniq на рубин вместо БД.

User.order("email DESC").pluck(:id).uniq 

Этот сценарий никогда не будет генерировать sql с четкими. Это uniq после pluck - это метод Array#uniq.

+0

Я упростил пример с помощью таблицы 'User' .....На самом деле существует такой случай, когда мне нужно выщипывать столбец 'a' после его упорядочения по столбцу' b' и получать только записи uniq по столбцу 'c'. В таком случае мне нужно использовать 'pluck',' uniq' и 'select' вместе – Hardik

+0

Здесь я написал эту проблему .... http://stackoverflow.com/a/25599109/2559490 – Hardik

+0

Мой второй скрипт в ответе получит массив идентификаторов, упорядоченный по электронной почте, и если он дублируется, с методом 'Array # uniq', возвращает идентификаторы uniq, упорядоченные по электронной почте. Но как вы можете получить столбец 'c' из коллекции только столбец' a'? Я не понимаю. –

Смежные вопросы