开发者社区> 问答> 正文

按比赛次数排序

我一直在进行搜索,但是似乎无法获得搜索功能来对结果进行排序。用户应该能够检查主题的多个复选框,任务是列出所有包含这些主题的书籍,并根据匹配次数对它们进行排名。这是我查询得到的结果,不会出错SELECT b.ISBN, b.TITLE FROM BOOKS b, BOOK_SUBJECT bs WHERE bs.ISBN = b.ISBN AND bs.SUBJECT_ID = 47 OR bs.SUBJECT_ID=48 ORDER BY

我的表的结构如下:

BOOK_SUBJECT ISBN SUBJECT_ID

12345678A 47 123456FF88 47 12345678A 48 123456FF88 49 123456FF55 47 123456FF55 48 123456FF55 49 123456FF11 48 123456FF11 49

BOOKS ISBN TITLE PRICE

12345678A Web Design 12 123456FF88 Getting JSON parse codec error testing on new machine 88.42 123456FF55 Second Test 88 123456FF11 Image stitching distorted wrap with multiple images 7

SUBJECTS SUBJECTID SUBJECT

47 Computer Science 48 Maths 49 Physics 81 Cooking 因此,举例来说,如果我搜索“计算机科学”和“物理”,则应返回所有匹配顺序为“先”和“后”的所有书籍。非常感谢,这是Stackoverflow的新手

问题来源于stack overflow

展开
收起
保持可爱mmm 2019-11-18 11:52:43 515 0
1 条回答
写回答
取消 提交回答
  • 首先,学习使用正确的JOIN语法。

    其次,查询的问题是缺少括号。。。但是正确的JOIN语法实际上可以解决该问题。我更喜欢IN:

    SELECT b.ISBN, b.TITLE FROM BOOKS b JOIN BOOK_SUBJECT bs ON bs.ISBN = b.ISBN WHERE bs.SUBJECT_ID IN (47, 48); 该查询至少应在合理的时间内返回。但是您可能想要同时具有两个主题而不是两个主题的书籍。如果是这样,请使用聚合。假设一本书不重复这些主题:

    SELECT b.ISBN, b.TITLE FROM BOOKS b JOIN BOOK_SUBJECT bs ON bs.ISBN = b.ISBN WHERE bs.SUBJECT_ID IN (47, 48) GROUP BY b.ISBN, b.TITLE HAVING COUNT(*) = 2; 或者,通过匹配对它们进行排名:

    SELECT b.ISBN, b.TITLE FROM BOOKS b JOIN BOOK_SUBJECT bs ON bs.ISBN = b.ISBN WHERE bs.SUBJECT_ID IN (47, 48) GROUP BY b.ISBN, b.TITLE ORDER BY COUNT(*) DESC;

    2019-11-18 11:52:53
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载