mysql查询,用于使用多个order-by条件进行(全文)搜索

5ssjco0h  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(301)

我有以下表格:

user
user_id | name
1          W
2          x
3          Y
4          Z

    author
auth_id | name
1          M
2          N
3          O
4          P

    preferred_author
user_id | auth_id
1          2
1          3
1          4
2          1

    book
book_id | title
1          Hello world 01
2          Hello world 02
3          Hello world 03
4          Hello world 04
5          Hello world 

  book_author
book_id | auth_id
1          2
2          3
3          4
4          1

现在当一个用户 W 搜索名为 hello world 我想显示的书籍是由用户的首选作者,首先,然后根据相关性的其他结果。我尝试的是 selecting all the ids of preferred authors and saved in a php array ```
PHP:
Say, $p_auth_ids = (2, 3, 4);

然后我运行了一个查询来搜索:

$query = "SELECT b.book_id, b.title,
MATCH(b.title) AGAINST("hello world" IN BOOLEAN MODE) AS relevance
FROM book AS b
INNER JOIN book_author AS ba ON b.book_id=ba.book_id
WHERE ba.auth_id IN ('".$p_auth_ids."')
AND
MATCH(b.title) AGAINST("hello world" IN BOOLEAN MODE)
ORDER BY relevance DESC"

输出应为:

book_id | title

1 Hello world 01
2 Hello world 02
3 Hello world 03
5 Hello world
4 Hello world 04

不起作用。那么我想要的是什么呢?谢谢。
k4ymrczo

k4ymrczo1#

我想这个问题会给你你想要的。它加入了 book 餐桌 preferred_author (通过 book_author )然后去公园 user table。在 JOINuser ,我们添加 user.name = 'W' 条件,以便只有该用户的首选作者具有非空值 user_id 在结果集中。然后我们可以在 user_id IS NULL (对于用户首选作者的书籍,其值为0,否则为1)后跟 relevance DESC :

SELECT b.book_id, b.title, MATCH(b.title) AGAINST("hello world" IN BOOLEAN MODE) AS relevance 
FROM book b
LEFT JOIN book_author ba ON ba.book_id = b.book_id
LEFT JOIN preferred_author pa ON pa.auth_id = ba.auth_id
LEFT JOIN user u ON pa.user_id = u.user_id AND u.name = 'W'
ORDER BY u.user_id IS NULL, relevance DESC

输出(请注意,您所有的标题都太相似,无法生成不同的相关性值,因此它不能完全按照您指定的排序,但是如果您在演示中更改标题,您将看到它在工作):

book_id     title           relevance
1           Hello world 01  0.000000003771856604828372
2           Hello world 02  0.000000003771856604828372
3           Hello world 03  0.000000003771856604828372
4           Hello world 04  0.000000003771856604828372
5           Hello world     0.000000003771856604828372

在dbfiddle上演示

相关问题