Mysql-запрос для (полнотекстового) поиска с множественным порядком по условиям - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть следующие таблицы:

    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

Не работает.Так какой должен быть запрос на то, что я хочу?Спасибо.

1 Ответ

0 голосов
/ 14 декабря 2018

Я думаю, что этот запрос даст вам то, что вы хотите.Он присоединяет таблицу book к preferred_author (через book_author), а затем к таблице userJOIN к user мы добавляем условие 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...