Как сделать расширенную фильтрацию объекта базы данных по их тегу 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' )
Однако, поскольку это несколько коррелированных подзапросов, он не будет хорошо масштабироваться. Это может хорошо работать до нескольких тысяч строк, но если вам нужны миллионы, нам нужно обсудить более сложные подходы.