2

我試圖回答this question我在哪裏得到了這個問題。Rails 3查詢:使用'select'與'order'時出現錯誤

我有一個用戶模型有id,emailfirst_name列。因此,在單個查詢中,我想要選擇具有不同first_name的用戶,按email對其進行排序並採用他們的ID

我該怎麼做?

什麼都不行:

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

    ,因爲它觸發這個SQL SELECT DISTINCT "users"."id" FROM "users"。這是從用戶選擇不同的ID。但是,我們要選擇不同的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 2014-09-02 06:39:31

+0

您的要求是不合理的。如果你區分first_name,你應該從一個first_name而不是一個id獲得許多id。 – 2014-09-02 10:47:08

回答

2

你可以用這個SQLFIDDLE測試SQL。

只有Sqlite和MySql支持這種用法,但其他的不支持。

請參考此postgresql document

在SQL-92標準,ORDER BY子句只能使用結果的列名或數字

也可以在訂單中使用任意表達式BY子句中,包括那些沒有出現在列SELECT結果列表。因此,以下聲明是有效的:

SELECT name FROM distributors ORDER BY code;

該功能的一個限制是,ORDER BY子句施加到UNION的結果,相交,或EXCEPT子句只能指定一個輸出列名或號,不表達。

對於你的情況,也沒有必要使用uniq的,所有的用戶ID已經不同,所以你爲什麼不試試這個:

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

假設的ID重複的,你可以通過紅寶石uniq的而不是數據庫。

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

此腳本將永遠不會生成獨特的SQL。採摘後uniqArray#uniq方法。

+0

我用'用戶表'簡化了這個例子.....實際上在這種情況下,我需要在按列「b」排序後採用列「a」,並按列「c」僅獲取uniq條目。在這種情況下,我需要使用'pluck','uniq'和'select' – Hardik 2014-09-02 09:23:40

+0

這裏我寫了這個問題.... http://stackoverflow.com/a/25599109/2559490 – Hardik 2014-09-02 09:24:15

+0

我的第二個腳本在答案將通過電子郵件獲得ids數組,如果它重複,則使用'Array#uniq'方法返回通過電子郵件排序的uniq id。但是,你怎麼能從一個集合中獲得'c'列只有'a'列?我不明白。 – 2014-09-02 09:36:13

相關問題