Mam dwie tabele:jeden-do-wielu relacji w (Postgre) SQL
posty:
id | ... other stuff ... | tags
----+---------------------+--------------
1 | ... | <foo><bar>
2 | ... | <foo><baz><blah>
3 | ... | <bar><blah><goo>
i tagi:
tag
--------------
<foo>
<bar>
<baz>
<blah>
<goo>
posts.tags i tags.tag są oba teksty typu. Co chcę to relacja z tags.tag do rzędach na stanowiskach takich zapytań <foo>
że da mi wiersze odpowiadające Posty 1 i 2, zapytań <blah>
daje mi 2 i 3 <bar>
daje mi 1 i 3, itd
Sprawdziłem klucze obce, ale nie jestem pewien, czy tego chcę. (i szczerze mówiąc, nie jestem do końca pewien, co robi). Z tego, co mogę powiedzieć, klucz obcy musi być równy kluczowi podstawowemu/unikalnej kolumnie tabeli. Ale to, co chcę jest taka, że wszystkie wiersze posts.tags ~ '.*<foo>.*'
, itd. Chcę również być w stanie, powiedzmy, uzyskać wszystkie znaczniki, które rozpoczynają się od B, np
CREATE VIEW startswithB AS
SELECT tag
FROM tags
WHERE tag ~ '<b.*>';
SELECT DISTINCT * FROM posts, startswithB WHERE posts.tags ~ ('.*' || startswithB || '.*');
Jak uzyskać relację szukam dla? Czy to możliwe?
EDIT:
Dobra, co zrobiłem:
tworzą post_tags:
SELECT posts.id, tags.tag
INTO post_tags
FROM posts, tags
WHERE posts.tags ~ ('.*' || tags.tag || '.*');
zaznaczyć wszystkie posty z tagiem <foo>
:
SELECT *
FROM posts
WHERE posts.id IN (
SELECT id
FROM post_tags
WHERE tag = '<foo>'
);
Poszukaj sql ["LIKE"] (http://www.postgresql.org/docs/7.4/static/functions-matching.html). W twoim przypadku nie można utworzyć klucza obcego, ponieważ wartość musi być zgodna w obu tabelach. –
Ten projekt jest BARDZO zły. Czy jesteś w środowisku, w którym możesz to zmienić? Odpowiednim projektem będzie: posty (identyfikator, tekst, materiały); tagi (identyfikator, tag); i posts_tags (post_id, tag_id), które odwołują się zarówno do tabeli postów, jak i tabeli znaczników (many2many relacji: znacznik ma wiele postów, a post ma wiele tagów) – Arthur