一個一對多的關係,我有兩個表:在(Postgre)SQL
帖子:
id | ... other stuff ... | tags
----+---------------------+--------------
1 | ... | <foo><bar>
2 | ... | <foo><baz><blah>
3 | ... | <bar><blah><goo>
和標籤:
tag
--------------
<foo>
<bar>
<baz>
<blah>
<goo>
posts.tags和tags.tag是兩種文字類型。我要的是從tags.tag關係到行的帖子,使得查詢<foo>
會給我相應的職位1和2行,查詢<blah>
給了我2和3,<bar>
給了我1和3等
我看過外鍵,但我不確定這是我想要的。 (說實話,我不完全確定它做了什麼)。從我可以告訴外鍵必須等於表的主鍵/唯一列。但我要的是所有行,posts.tags ~ '.*<foo>.*'
,等我也希望能夠,比如說,得到以b開頭的所有標籤,如:
CREATE VIEW startswithB AS
SELECT tag
FROM tags
WHERE tag ~ '<b.*>';
SELECT DISTINCT * FROM posts, startswithB WHERE posts.tags ~ ('.*' || startswithB || '.*');
我如何獲得我找的關係對於?可能嗎?
編輯:
好吧,我做了什麼:
創建post_tags:
SELECT posts.id, tags.tag
INTO post_tags
FROM posts, tags
WHERE posts.tags ~ ('.*' || tags.tag || '.*');
選擇的所有帖子與標籤<foo>
:
SELECT *
FROM posts
WHERE posts.id IN (
SELECT id
FROM post_tags
WHERE tag = '<foo>'
);
查找sql ['LIKE'](http://www.postgresql.org/docs/7.4/static/functions-matching.html)。在你的情況下,不可能創建一個外鍵,因爲這兩個表中的值必須匹配。 – 2012-03-07 18:14:00
這種設計非常糟糕。你是否處於可以改變它的環境中?一個適當的設計將是:帖子(ID,文本,東西);標籤(id,tag);和posts_tags(post_id,tag_id),它們同時引用了帖子表和標籤表(many2many關係:標籤有很多帖子,帖子有很多標籤) – Arthur 2012-03-07 18:16:17