我有两张桌子:
帖子:
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>' );