mysql - 从具有 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 语句(这是一段相对较旧的代码,最近由我负责),通过根据参数向查询添加各自的位来“组装”搜索查询的请求。如果可能的话,我想避免从头开始写整个事情。
解决方案
推荐阅读
- python - 需要支持使用 pyautogui 制作 python 增量循环
- python-3.x - 在python中,函数调用后的数组是什么意思
- java - 当 POJO 类之一具有 hashmap(HashMap) 时如何将 JSON 读入 POJO 类
) - reactjs - 即使超时,useState 更新状态在同一处理程序中也不可用
- linux - 删除超过 10 分钟的 docker 镜像
- multithreading - 混合并行化:“仅让 'my_id ==0' 进程执行 openMP 调用”可能吗?
- java - 使用java获取word文件的文本
- javascript - 如何在不合并对象属性的情况下推送对象数组以创建新数组?
- python - 以下程序的输出如何是“2”?请有人告诉我它是怎么来的 2
- python - 提示用户输入 csv 文件中的列名(不使用 pandas 框架)