【发布时间】:2019-07-22 06:41:40
【问题描述】:
被这个问题困扰了一段时间,非常感谢您的建议
假设我在这里有一个个人博客数据库:
第一个表:
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
【问题讨论】:
-
很难。很多加盟。讨论EAV topic on this link
-
非常有趣,似乎我发现通过使用 UNION、INTERSECT 和 MINUS,我们至少能够以一种简单的方式证明这一点。就像
SELECT pid FROM tags WHERE tag ='a' INTERSECT (SELECT pid FROM tags WHERE tag='b' UNION SELECT pid FROM tags WHERE tag = 'c') INTERSECT ( ( SELECT DISTINCT pid FROM tags) MINUS (SELECT pid FROM tags WHERE tag='d'))。也就是说,` && -> 相交,|| -> 联合,! -> 全部减号 $var`
标签: mysql database-design relational-database entity-attribute-value