首页 > 解决方案 > 从具有 AND NOT 条件的 NN 关系中进行选择

问题描述

我对这个标题不太满意,但这是我能做到的最好的。道歉。

因此,在我的数据库 (mariadb 10-3) 中,我有一个books表、一个authors表和一个常规的 ol'books_authors连接表将两者联系在一起。此数据库中的许多书籍都有多个作者,因此它们由每个作者的联结表中的多行表示。

该应用程序有一个相对复杂的搜索表单,用户可以(或应该能够)添加/删除多个参数和搜索逻辑。例如,您可以添加一个参数以从标题中排除字符串。或来自作者姓名。

现在,在排除作者姓名的情况下按标题名称搜索的查询如下所示。它是简化版本,通常它有更多的 WHERE 条件,引用其他几个表。虽然我认为相关的部分都在那里:

SELECT aut.name, lib.name, lib.entry_id, lib.title 
FROM (books as lib, author as aut, books_authors as ba) 
WHERE lib.entry_id = ba.entry_id AND ba.author_id = aut.id
AND lib.title LIKE '%foo%' AND (aut.name NOT LIKE '%bar%')

这仅适用于只有一位作者的书籍。否则它是无用的,因为它只消除了其中一位作者。例如,如果一本书是由两个名叫亚伯拉罕和弗兰克的家伙写的,如果您搜索标题为“巴比伦”但没有作者“弗兰克”的书,您仍然会得到亚伯拉罕弗兰克写的《巴比伦的灰烬》作为查询过滤掉了弗兰克,但是这本书仍然通过亚伯拉罕得到。

所以问题是,当至少有一个作者被过滤掉时,我如何修改上面的查询以从搜索中排除一本书?

该表单的控制器有一长串 if 语句(这是一段相对较旧的代码,最近由我负责),通过根据参数向查询添加各自的位来“组装”搜索查询的请求。如果可能的话,我想避免从头开始写整个事情。

标签: mysqldatabasemariadb-10.3

解决方案


推荐阅读