簡體   English   中英

PostgreSQL獲取唯一列表的列表,並按另一個表列排序

[英]postgresql get list of unique list with order by another table column

表格:

#leads
id | user_id |created_at | updated_at 

#users
id | first_name

#todos
id | deadline_at | target_id

我想按todos.deadline_at desc的順序獲取兩個日期(deadline_at)之間的線索的唯一列表

我做:

SELECT distinct(leads.*), todos.deadline_at
FROM leads
INNER JOIN users ON users.id = leads.user_id
LEFT JOIN todos ON todos.target_id = leads.user_id
WHERE (todos.deadline_at between '2015-11-26T00:00:00+00:00' and '2015-11-26T23:59:59+00:00')
ORDER BY todos.deadline_at DESC;

該查詢返回右順序列表,但有重復項。 如果我對leads.id使用distinct或distinct,則postgresql要求我按以下順序使用它:在這種情況下,我得到了錯誤的有序列表。

我怎樣才能達到預期的結果?

由於您實際上並不需要users表。 也許試試這個?

Lead.joins("INNER JOIN todos ON leads.user_id = todos.target_id")
    .where("leads.deadline_at" => (date_a..date_b))
    .select("leads.*, todos.deadline_at")
    .order("todos.deadline_at desc")

它表明您將sql表的結果與join和ActiveRecord處理關聯后的相同結果相混淆。

我假設has_many :todos, through: :user Lead has_many :todos, through: :user所以你可以這樣做:

Lead.eager_load(:todos).
     where("leads.deadline_at" => (date_a..date_b)).
     order("todos.deadline_at")

無需應用distinct或任何其他內容,ActiveRecord會從todos挑選leads ,您將以正確的順序排列它們,沒有重復。 但是原始的sql結果將有很多重復項。

如果你想獨自實現SQL類似的東西,你可以用distinctgroup byleads.id ,但隨后你將失去所有的todos它“包含”。 但是,您可以使用聚合函數來計算/提取“丟失的待辦事項數據”上的內容。

例如 :

Lead.joins(:todos).
     group("leads.id").
     select("leads.*, min(todos.deadline_at) as first_todo_deadline")
     order("first_todo_deadline")

注意, todos數據僅在聚合函數中(最小值,計數,平均等)可用,因為如果您希望每條線索都將待辦事項“壓縮”!

希望有道理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM