【问题标题】:Ordering by the number of matches按匹配数排序
【发布时间】:2019-11-17 00:29:55
【问题描述】:

我一直在进行一些搜索,但我似乎无法让我的搜索功能对我的结果进行排序。用户应该能够检查多个主题复选框,任务是列出所有包含这些主题的书籍,并按匹配数对它们进行排名。就我的查询而言,这是没有错误的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 的新手

【问题讨论】:

    标签: mysql sql search


    【解决方案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);
    

    此查询至少应在合理的时间范围内返回。但是您可能想要具有both 主题而不是either 主题的书籍。如果是这样,请使用聚合。假设一本书的主题不重复:

    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;
    

    【讨论】:

      猜你喜欢
      • 2011-08-04
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多