У меня есть таблица БД urls, похожая на эту
id | user_id | name
----------------------------
1 | 56 | John
2 | 25 | Carry
3 | 56 | Jim
4 | 12 | Jolana
5 | 12 | Ava
Что мне нужно сделать, так это выбрать строки с первое появлениеuser_id, заказанные в DESC с помощью id. В этом случае это будет означать выбор строк с идентификаторами 5, 3 и 2.
Можно ли этого каким-то образом добиться с помощью Eloquent или, если нет, с помощью чистого SQL? Я могу представить себе сценарий для этого, но я бы хотел, чтобы он работал с одним запросом.






Это легко сделать с помощью SQL:
select t.*
from t
where t.id = (select min(t2.id) from t t2 where t2.user_id = t.user_id);
Я действительно не понимаю запрос. Не могли бы вы отрегулировать его так, чтобы он соответствовал моему примеру с именем таблицы urls?
@JakubSzymsza Вот и все, Демо. Я думаю, вам нужен MAX, а не MIN.
Вы можете использовать ROW_NUMBER:
SELECT *
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY id DESC) AS rn
FROM tab_name) sub
WHERE rn = 1
ORDER BY id DESC;
Демонстрация DBFiddle - MySQL 8.0
Я продолжаю получать синтаксическую ошибку рядом с PARTITION BY как в MySQL, так и в MariaDB на моем сервере
@JakubSzymsza Возможно, вы используете устаревшую версию.
Я использую MariaDB 10.0.34, но по какой-то причине он все еще не работает. Но неважно, решение Гордона работает. Спасибо.
@JakubSzymsza ROW_NUMBER был представлен в MariaDB 10.2.0> 10.0.34
что вы пробовали? у вас есть модель или вы хотите перейти к необработанный sql (что я лично не буду одобрять, как два ответа ниже). если у вас была модель с именем
Url, примерно, вы можете назвать следующую модельUrl:all()->orderByDesc('id')->groupBy('user_id'). однако обратите внимание на этот привилегии конфигурации.