使用公共外键和各种其他值有效地选择项目

时间:2015-01-12 21:54:47

标签: sql

我觉得我可能已经把自己投入了一个角落,但是我已经有2.7亿行了,宁可不要重新开始。 :)

我有一个表,位置,有以下相关列:

  • id:职位ID
  • event_id:事件的外键
  • 位置:此字段的实际位置
  • word_id:唯一字词的外键

我试图找出一种方法来使用相当于内部联接的ANSI SQL有效地进行查询,但是我很难过。这就是我需要找到的东西:

我对event_id的所有不同值感兴趣,其中一组位置(由event_id相关)包含一组单词(由word_id相关)。

我是否已将自己置于角落?我觉得我需要另一个将单词直接与事件联系起来的联接表,以便有效地完成这项工作。

职位架构:

                                     Table "public.positions"
   Column   |            Type             |                       Modifiers                        
------------+-----------------------------+--------------------------------------------------------
 id         | integer                     | not null default nextval('positions_id_seq'::regclass)
 word_id    | integer                     | 
 position   | integer                     | 
 event_id   | integer                     | 
 created_at | timestamp without time zone | 
 updated_at | timestamp without time zone | 
Indexes:
    "positions_pkey" PRIMARY KEY, btree (id)
    "idx_words" btree (word_id)
    "index_positions_on_event_id" btree (event_id)
    "index_positions_on_word_id" btree (word_id)

1 个答案:

答案 0 :(得分:1)

我通过创建另一个连接表events_words来解决问题,这些连接表用于跟踪哪些字出现在哪些事件中。这允许更有效的内部连接,但在我看来,内部连接往往超级凌乱:

select distinct a.event_id from events_words as a inner join events_words as b on a.event_id=b.event_id and b.word_id=1 inner join events_words as c on a.event_id=c.event_id and c.word_id=15;

超级工作和查询时间从45秒+下降到< 1秒。