我有一个包含三个表的数据库:书籍(书籍详细信息,PK是CopyID),关键词(关键词列表,PK是ID)和KeywordsLink,这是书籍和关键词之间的多个链接表,带有字段ID, BookID和KeywordID.
我正在尝试在我的应用中创建一个高级搜索表单,您可以在其中搜索各种条件.目前我已经与Title,Author和Publisher合作(全部来自Book表).它产生如下SQL:
SELECT * FROM Books WHERE Title Like '%Software%' OR Author LIKE '%Spolsky%';
我想扩展此搜索以使用标记进行搜索 - 基本上是添加另一个OR子句来搜索标记.我尝试通过执行以下操作来完成此操作
SELECT * FROM Books, Keywords, Keywordslink WHERE Title LIKE '%Joel%' OR (Name LIKE '%good%' AND BookID=Books.CopyID AND KeywordID=Keywords.ID)
我认为使用括号可能会将第二部分分成它自己的kinda子句,因此仅在该部分中评估连接 - 但它似乎并非如此.它给我的全部是一本书的多个副本的长列表,满足了这Title LIKE '%Joel%'
一点.
有没有办法使用纯SQL执行此操作,或者我必须使用两个SQL语句并将它们组合在我的应用程序中(在此过程中删除重复项).
如果这很重要,我现在正在使用MySQL,但该应用程序使用ODBC,我希望使它与数据库无关(甚至可能最终使用SQLite或者拥有它,以便用户可以选择使用哪个数据库).
您需要将3个表连接在一起,这为您提供了一个表格结果集.然后,您可以检查您喜欢的任何列,并确保获得明显的结果(即没有重复).
像这样:
select distinct b.* from books b left join keywordslink kl on kl.bookid = b.bookid left join keywords k on kl.keywordid = k.keywordid where b.title like '%assd%' or k.keyword like '%asdsad%'
您还应该尝试避免使用百分号(%)启动LIKE值,因为这意味着SQL Server无法在该列上使用索引并且必须执行完整(和慢速)表扫描.这开始使您的查询成为"开始于"查询.
也许考虑SQL Server中的全文搜索选项.