我正在尝试创建一个查询,该查询可以从我的数据库中选择所有包含黑名单标记的帖子,除非帖子包含白名单标记。标签存储在文本列(即" tag1 tag2 tag3 "
(中。
以这个伪代码为例:
let whitelist = ['tag1', 'tag3', 'tag5'];
let blacklist = ['tag2', 'tag4', 'tag6'];
connection.query('SELECT * FROM `posts` WHERE `tags` CONTAINS BLACKLIST TAG AND NOT WHITELIST TAG;', function (err, results) {
// Returns all posts that have a blacklisted tag unless the post contains a tag on the whitelist
});
是否可以使用白名单和黑名单的内容生成查询,以选择包含黑名单标签的帖子,除非它们包含白名单标签?
这里最好的做法是正确规范tags
,而不是使用空格分隔的值列表。不过,如果您一直使用这种格式,您可以使用regex在标记列表中的每个数组中查找其中一个值。您可以使用:从whitelist
和blacklist
数组生成regex
whitelist_regex = ' ' + whitelist.join(' | ') + ' ';
blacklist_regex = ' ' + blacklist.join(' | ') + ' ';
然后您的查询变成
connection.query('SELECT * FROM `posts` WHERE `tags` RLIKE ? AND `tags` NOT RLIKE ?',
[ blacklist_regex, whitelist_regex ],
function (err, results) {
// ...
});
更新
如果tags字段看起来像是tagtype:tag
格式的一系列空格分隔的值,则可以更改两个正则表达式以匹配该格式:
whitelist_regex = ':' + whitelist.join(' |:') + ' ';
blacklist_regex = ':' + blacklist.join(' |:') + ' ';