mySQL:如果文本列包含黑名单上的项目,则选择行



我正在尝试创建一个查询,该查询可以从我的数据库中选择所有包含黑名单标记的帖子,除非帖子包含白名单标记。标签存储在文本列(即" 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在标记列表中的每个数组中查找其中一个值。您可以使用:从whitelistblacklist数组生成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(' |:') + ' ';

最新更新