Как сделать расширенную фильтрацию объекта базы данных по их тегу attritube

Был обеспокоен этим вопросом в течение некоторого времени и очень ценю ваш совет

Предположим, у меня есть база данных для личного блога здесь:

первая таблица:

CREATE TABLE posts(
pid TINYINT,
content TEXT,
PRIMARY KEY (pid)
);

второй стол:

CREATE TABLE tags(
pid TINYINT,
tag VARCHAR(16),
PRIMARY KEY (pid, tag),
FOREIGN KEY (tag) REFERENCES posts(pid)
);

и говорят, что у них есть некоторые данные, такие как

tags

------------------------------
pid             |          tag
1               |            a
1               |            b
1               |            d

2               |            a
2               |            c                          

и я хотел бы позволить клиенту (пользователю) выполнять "расширенную фильтрацию"

как использование SELECT pid FROM tags WHERE tag `MATCHES` a && ( b || c ) && !d точно соответствовать pid 2

0 ответов

Довольно прямое отображение WHERE tagМАТЧИa && ( b || c ) && !d является

WHERE     ( EXISTS SELECT 1 FROM tags WHERE pid = a.pid AND tag = 'a' )
  AND     ( EXISTS SELECT 1 FROM tags WHERE pid = a.pid AND tag IN ('b', 'c') )
  AND NOT ( EXISTS SELECT 1 FROM tags WHERE pid = a.pid AND tag = 'd' )

Однако, поскольку это несколько коррелированных подзапросов, он не будет хорошо масштабироваться. Это может хорошо работать до нескольких тысяч строк, но если вам нужны миллионы, нам нужно обсудить более сложные подходы.

Другие вопросы по тегам