[英]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類似的東西,你可以用distinct
或group by
對leads.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.