2012-09-21 48 views
0

我与Rails的工作,我有一个Link ActiveRecord的模式与此表:一到一个双向关系查询

create_table "links", :force => true do |t| 
    t.string "name",  :null => false 
    t.integer "sender_id", :null => false 
    t.integer "receiver_id", :null => false 
end 

add_index "links", ["name"], :name => "index_links_on_name" 
add_index "links", ["sender_id", "receiver_id"], :name => "index_links_on_sender_id_and_receiver_id", :unique => true 

我想什么做的就是以选择name = "follow"其存在的各个环节从源到目的地,从目的地到源。

例如,具有以下条目:

id | name  | sender_id | receiver_id 
--------------------------------------- 
66 | "follow" | 1   | 2 
67 | "follow" | 2   | 1 
68 | "follow" | 1   | 3 
69 | "fuu" | 3   | 1 
70 | "bar" | 2   | 25 
71 | "bar" | 25  | 2 

...我想只得到6667 IDS作为一个结果。因为sender_id 1和receiver_id 67从源链接到目标,并且也从目标链接到源(在这两种情况下都有一个“跟随”名称)。

我们可以做到吗,只需一个SQL查询(直接在SQL中或ActiveRecord ORM中)?非常感谢!

回答

2

尝试以下查询>>

select * from tablename t1,t2 where t1.sender_id = t2.receiver_id and t2.sender_id=t1.receiver_id and Name like follow" 
+0

,当然,请确保您有在桌子上适当的索引。如果没有索引,如果有大量数据,这将会是一个很慢的查询。 (使用'EXPLAIN'来查看查询计划器生成的计划。) – cdhowie

+0

@cdhowie:可能是你的权利......但我的意图是在这些情况下给出关于查询写作的想法的方向...... – Freelancer

+0

是的,我的评论并没有针对你,而只是为了向任何读者提供一些关于表现的信息。 – cdhowie