WITH RankedMessages AS (
SELECT
n.id,
n.id_u,
n.time,
n.title_prev,
ROW_NUMBER() OVER (PARTITION BY n.id_u ORDER BY n.time DESC) AS rn
FROM
indexnews n
WHERE n.approve = 1
)
SELECT
id,
id_u,
time,
title_prev
FROM
RankedMessages
ORDER BY
rn, time DESC, id_u
В mysql, вытаскиваем по 1 последней записи от каждого пользователя, как все уникальные публикации по 1 на одного пользователя достали. Выстраиваем таким образом, чтобы сперва было чередование.
Не должно получиться так, что 2 и более новости подряд были от одного пользователя
Допускается по 2 и более подряд, когда у других пользователей больше нет публикаций. Чем ближе конец, тем чаще будут чередоваться новости от одних и тех же пользователей.
Попробовал выполнить тоже самое с мантикоре, ничего не вышло. Попытался с нейросетью, множество вариантов. Ничего не выходит…
Может кто подскажет какой лучше вариант реализации подобного?
Сортировка по времени от большего к меньшему
Необходимо разбавить новости, чтобы избежать таких случаев когда идут подряд публикации от одгого пользователя. Исключение тогда, когда публикаций от других пользователей нету.
WITH RankedMessages AS (
SELECT
n.id,
n.id_u,
n.time,
n.title_prev,
ROW_NUMBER() OVER (PARTITION BY n.id_u ORDER BY n.time DESC) AS rn
FROM
news n
)
SELECT
id,
id_u,
time,
title_prev
FROM
RankedMessages
ORDER BY
rn, time DESC
Рабочий вариант для mysql. Вытаскиваем по 1 записи от каждого пользователя, на второй круг пойдет тогда когда пробежится по всем пользователям. Когда достанет 1 записи от каждого пользователя, тогда начнет доставать по второй записи
Как такое возможно выполнить на мантикоре?
SELECT * FROM indexnews WHERE MATCH('@title_prev \"{$title}\"/0.4')
Тут просто достаем схожие записи, индекс indexnews изначально был сформирован с сортировкой по времени от большего к меньшему.
Быть может стоит попробовать сделать такой запрос для формирования индекса. Правильно это будет или стоит делать это в запросе к индексу?
Как в таком случаи верно построит запрос к индексу?
(myenv) root@desktop:~# sudo -u manticore indexer --all --rotate
Manticore 7.4.6 b2ff82920@25022808 (columnar 4.1.1 25f4706@25022806) (secondary 4.1.1 25f4706@25022806) (knn 4.1.1 25f4706@25022806)
Copyright (c) 2001-2016, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
Copyright (c) 2017-2024, Manticore Software LTD (https://manticoresearch.com)
using config file '/etc/manticoresearch/manticore.conf'...
indexing table 'indexnews'...
ERROR: table 'indexnews': sql_query: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ROW_NUMBER() OVER (PARTITION BY n.id_u ORDER BY n.time DESC) AS rn ' at line 1 (DSN=mysql://User:***@localhost:3306/Baza).
total 0 docs, 0 bytes
total 0.010 sec, 0 bytes/sec, 0.00 docs/sec
total 0 reads, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg
total 0 writes, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg
Попытался перенести туже логику с mysql, в запрос для формирования индекса. Увы, не выходит.
Сортировка по time от большего к меньшему, если следующая запись содержит тот же id_user, разбавить, взять запись ранее добавленную от другого пользователя? А уже после нее вставить тут которая шла с тем же id_user.
Так все записи перебрать и выстроить их должным образом…
Немного спутал. Не вариант делать это при формирования индекса, при выборке релевантного контента. Все будет также, в плане будут моменты когда несколько публикаций от одного пользователя подряд.
Про функции. Не совсем понял, возможно написать свою функцию и из php обращаться к ней для работы с индексом?