Laravel - выберите строки с первым появлением значения столбца

У меня есть таблица БД 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 (что я лично не буду одобрять, как два ответа ниже). если у вас была модель с именем Url, примерно, вы можете назвать следующую модель Url:all()->orderByDesc('id')->groupBy('user_id'). однако обратите внимание на этот привилегии конфигурации.

Bagus Tesa 05.05.2018 13:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
627
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это легко сделать с помощью SQL:

select t.*
from t
where t.id = (select min(t2.id) from t t2 where t2.user_id = t.user_id);

Я действительно не понимаю запрос. Не могли бы вы отрегулировать его так, чтобы он соответствовал моему примеру с именем таблицы urls?

Jakub Szymsza 05.05.2018 13:04

@JakubSzymsza Вот и все, Демо. Я думаю, вам нужен MAX, а не MIN.

Lukasz Szozda 05.05.2018 13:19

Вы можете использовать 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 - MariaDB 10.2

Демонстрация DBFiddle - MySQL 8.0

Я продолжаю получать синтаксическую ошибку рядом с PARTITION BY как в MySQL, так и в MariaDB на моем сервере

Jakub Szymsza 05.05.2018 13:03

@JakubSzymsza Возможно, вы используете устаревшую версию.

Lukasz Szozda 05.05.2018 13:18

Я использую MariaDB 10.0.34, но по какой-то причине он все еще не работает. Но неважно, решение Гордона работает. Спасибо.

Jakub Szymsza 05.05.2018 13:31

@JakubSzymsza ROW_NUMBER был представлен в MariaDB 10.2.0> 10.0.34

Lukasz Szozda 05.05.2018 13:32

Другие вопросы по теме