Я использую PostgreSQL 11 и SQLAlchemy. У меня есть следующая таблица, сопоставленная с классом PostSignature
:
Table "public.post_signature"
Column | Type | Collation | Nullable | Default
-----------+-----------+-----------+----------+---------
post_id | integer | | not null |
signature | bytea | | not null |
words | integer[] | | not null |
Indexes:
"post_signature_pkey" PRIMARY KEY, btree (post_id)
Foreign-key constraints:
"post_signature_post_id_fkey" FOREIGN KEY (post_id) REFERENCES post(id)
Для контекста я хочу отсортировать, создав значение «Score», которое является счетчиком количества элементов в «словах». которые соответствуют параметру запроса. Я хочу, чтобы сопоставление было поэлементным, а не просто пересечением множества. Все массивы имеют одинаковое количество элементов.
Я обнаружил, что следующий необработанный запрос SQL выполняет эту задачу:
SELECT s.post_id, s.signature, count(a.query) AS score
FROM post_signature AS s, unnest(s.words, $1) AS a(word, query)
WHERE a.word = a.query
GROUP BY s.post_id
ORDER BY score DESC LIMIT 100;
Я хочу написать это как оператор SQLAlchemy, который было бы эквивалентно этому. Что-то вроде: session.query(PostSignature).<some statement>.limit(100).all()
Кто-нибудь знает, как я могу построить этот запрос?