Как отличить столбец имени и отображать только самый высокий ts_rank для этого столбца PostgreSQL - PullRequest
0 голосов
/ 29 апреля 2018

Я разместил вопрос по этому здесь , но потом понял, что хочу большего, чем просто то, что я спрашивал.

Мне действительно нужно быть ОТЛИЧНЫМ от столбца name по его наибольшему ts_rank, поэтому мой код:

SELECT name
    ,ts_rank(to_tsvector(name), query) + ts_rank(to_tsvector(content), query2) AS rank
FROM users
INNER JOIN microposts ON users.id = microposts.user_id
    ,plainto_tsquery('re') query
    ,plainto_tsquery('comics') query2
WHERE users.name @@ query
OR microposts.content @@ query2
ORDER BY rank DESC;

Придает

╔════════════════╤═════════════════════════════════════════╤═══════════╗
║ name           │ content                                 │ rank      ║
╠════════════════╪═════════════════════════════════════════╪═══════════╣
║ Dawson Kreiger │ dc comics dc comics dc comics dc comics │ 0.0919062 ║
╟────────────────┼─────────────────────────────────────────┼───────────╢
║ Kaylin Green   │ dc comics dc comics dc comics           │ 0.0889769 ║
╟────────────────┼─────────────────────────────────────────┼───────────╢
║ Dawson Kreiger │ dc comics dc comics                     │ 0.0827456 ║
╟────────────────┼─────────────────────────────────────────┼───────────╢
║ Kaylin Green   │ dc comics                               │ 0.0759909 ║
╟────────────────┼─────────────────────────────────────────┼───────────╢
║ Dawson Kreiger │ I went to the beach dc comics           │ 0.0607927 ║
╟────────────────┼─────────────────────────────────────────┼───────────╢
║ Dawson Kreiger │ I went to the beach dc comics           │ 0.0607927 ║
╟────────────────┼─────────────────────────────────────────┼───────────╢
║ Kaylin Green   │ I went to the beach dc comics           │ 0.0607927 ║
╟────────────────┼─────────────────────────────────────────┼───────────╢
║ Kaylin Green   │ I went to the beach dc comics           │ 0.0607927 ║
╚════════════════╧═════════════════════════════════════════╧═══════════╝

Так что мне нужно, чтобы вывод был таким,

╔════════════════╤═════════════════════════════════════════╤═══════════╗
║ name           │ content                                 │ rank      ║
╠════════════════╪═════════════════════════════════════════╪═══════════╣
║ Dawson Kreiger │ dc comics dc comics dc comics dc comics │ 0.0919062 ║
╟────────────────┼─────────────────────────────────────────┼───────────╢
║ Kaylin Green   │ dc comics dc comics dc comics           │ 0.0889769 ║
╚════════════════╧═════════════════════════════════════════╧═══════════╝

Поэтому мне нужно выбрать запись, которая отличается по имени и имеет самый высокий rank. Но как код узнает, как выбрать отдельного пользователя с самым высоким значением ts_rank?

EDIT

Например, если я сделаю это

SELECT name
    , ts_rank(to_tsvector(name), query) + ts_rank(to_tsvector(content), query2) AS rank 
FROM
    (
     SELECT DISTINCT name FROM users WHERE rank = MAX(rank)
     ) 
INNER JOIN microposts ON users.id=microposts.user_id
    , plainto_tsquery('re') query
    ,plainto_tsquery('comics') query2 
WHERE users.name @@ query 
OR microposts.content @@ query2 
ORDER BY rank DESC;

Я получаю error: column "rank" does not exist

1 Ответ

0 голосов
/ 29 апреля 2018

Вы можете сделать GROUP BY с MAX.

SELECT name
    ,MAX(ts_rank(to_tsvector(name), query) + ts_rank(to_tsvector(content), query2)) AS rank
FROM users
INNER JOIN microposts ON users.id = microposts.user_id
    ,plainto_tsquery('re') query
    ,plainto_tsquery('comics') query2
WHERE users.name @@ query
OR microposts.content @@ query2
GROUP BY name
ORDER BY rank DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...