按匹配数排序

问题描述 投票:0回答:1

我一直在进行搜索,但是似乎无法获得搜索功能来对结果进行排序。用户应该能够选中多个主题复选框,并且任务是列出所有包含这些主题的书籍,并根据匹配次数对它们进行排名。这是我查询得到的,但没有错误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个回答
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主题而不是任一主题的书。如果是这样,请使用聚合。假设一本书不重复这些主题:

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;
© www.soinside.com 2019 - 2024. All rights reserved.