私は次の表を持っています:
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
iという名前の本を検索すると、ユーザーの優先著者による本が最初に表示され、次に関連性に応じて他の結果が表示されます。私が試したのは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
動作しませんでした。だから私が欲しいもののクエリは何である必要がありますか?ありがとう。
このクエリはあなたが望むものを与えると思います。book
テーブルをpreferred_author
(via book_author
)に結合し、次にテーブルに結合しuser
ます。でJOIN
にuser
、我々は、追加user.name = 'W'
ユーザの好みの著者がnull以外を持っているだけというように条件を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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加