как сделать расширенную фильтрацию объекта базы данных по их тегу attritube - PullRequest
0 голосов
/ 28 февраля 2019

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

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

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

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

1 Ответ

0 голосов
/ 07 марта 2019

Довольно прямое отображение WHERE tag MATCHES 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' )

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...