我正盡我所能地圍繞着arel和它背後的關係代數彎曲我的大腦,但如何表示SELECT DISTINCT
始終無法理解我的理解。任何人都可以解釋如何arel:如何使用arel /關係代數獲取不同的值
SELECT DISTINCT title FROM posts;
非常感謝!
我正盡我所能地圍繞着arel和它背後的關係代數彎曲我的大腦,但如何表示SELECT DISTINCT
始終無法理解我的理解。任何人都可以解釋如何arel:如何使用arel /關係代數獲取不同的值
SELECT DISTINCT title FROM posts;
非常感謝!
Post.select('DISTINCT title')
更新1:
在後的時間,這是不具備的阿雷爾。這些天來,ActiveRecord的:: QueryMethods有uniq
方法(http://apidock.com/rails/ActiveRecord/QueryMethods/uniq),所以你會希望:
Post.select(:title).uniq
更新2: 貌似阿雷爾現在支持這種行爲。 @maerics有正確的答案。如果這不是我們接受的答案,我會刪除它。
不完全代數,但很難與它的效率爭論;-) – jemmons 2010-07-06 22:32:34
這種方法存在一個致命的問題:如果您有多個範圍使用select語句,將它們鏈接在一起可能會導致無效的SQL。 – 2011-04-25 21:55:28
這不是AREL,因此它不回答問題。 – 2011-09-30 15:19:15
上一個答案是Rails方式,不是嗎?不是Arel的方式。
這適用於arel的1.x:
posts = Table(:posts)
posts.project(Arel::Distinct.new(posts[:title]))
我猜還有另一個「更正確」的方式通過API來做到這一點,但我還沒有想通了這一點呢。
這似乎現在不起作用。 – 2011-11-08 18:12:10
這是真的。這個答案適用於Arel 1.x,並且不再有效。 – numbers1311407 2011-11-09 03:44:16
你知道另一個選擇嗎? – 2011-11-09 10:53:18
如果你正在做這個使用範圍:
scope :recent, lambda {|count|
select("DISTINCT posts.*").
joins(:whatever).
limit(count).
order("posts.updated_at DESC")
}
由於AREL總是使用SET在它的操作中,重複行的結果將被自動刪除。只需使用普通的項目(Phi)操作即可。
理論上這是個不錯的主意,但在現實中顯然是虛假的。 Arel查詢將從任何投影中返回重複條目,除非顯式限制爲「distinct」方法。 – maerics 2012-09-19 04:50:38
使用純阿雷爾(未軌道/ ActiveRecord的)有一個「鮮明」的方法:
Arel::VERSION # => '3.0.2'
posts = Arel::Table.new(:posts)
posts.project(posts[:title])
posts.distinct
posts.to_sql # => 'SELECT DISTINCT "posts"."title" FROM "posts"'
奇怪的是,「不同的」方法沒有環連接,每另一阿雷爾方法。
的阿雷爾方式做到這一點是:
t = Arel::Table.new(:foo)
count_distinct = t[:field].count(true)
count_distinct.to_sql # => "COUNT(DISTINCT `foo`.`field`)"
'count(true)'對於Arel 3 – 2014-10-15 23:08:38
我不知道AREL但是從我讀「深度數據庫」由CJDate,在關係代數查詢的結果是一組元組。所以如果arel遵循這個理論而不是獨特的應該是默認的。 – 2010-06-28 21:42:01