我一直在进行搜索,但是似乎无法获得搜索功能来对结果进行排序。用户应该能够选中多个主题复选框,并且任务是列出所有包含这些主题的书籍,并根据匹配次数对它们进行排名。这是我查询得到的,但没有错误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的新手
首先,学习使用正确的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;