Как выбрать последний из каждого option_id user_id?
+-----+-----------+---------+-------+
| id | option_id | user_id | value |
+-----+-----------+---------+-------+
| 241 | 6 | 2 | 2 |
| 240 | 5 | 2 | 1 |
| 90 | 5 | 2 | 15 |
| 75 | 4 | 2 | 11 |
| 76 | 4 | 2 | 1 |
| 77 | 4 | 2 | 2 |
| 72 | 4 | 1 | 10 |
| 71 | 4 | 1 | 15 |
| 70 | 5 | 1 | 2 |
+-----+-----------+---------+-------+
Как написать запрос, используя Eloquent, чтобы получить только последний из каждого option_id данного user_id?
Для предоставленной таблицы вывод для user_id 2 должен быть идентификатором записи: 241,240,75.
Для записей user_id 1: 72, 70
Обновлено:
Просто чтобы повторить итерацию, я хотел бы вернуть коллекцию последних option_id для данного user_id.
Поэтому для user_id 2 будет 3 записи:
Для user_id 1 будет только 2 записи:
Что это за модель?
@MrMoxy Пользователь 2 имеет записи для option_id 4, 5 и 6. И ему в основном нужна самая новая запись для каждого option_id.
@ Томас, это именно то, что я хочу. Спасибо
Table::select(DB::raw('max(created_at)'),'col1,col2,col3'))->groupby('option_id')->distinct()->опозданияt( )->получить(); ? Попробуй это?
@LimKeanPhang извините, бесполезно, у меня нет столбца created_at. Это будет самый высокий идентификатор, который можно использовать для определения идентификатора новейшей опции.
Table::select(DB::raw('max(id)'),'col1,col2,col3'))->groupby('option_id')->distinct()->latest()-> получить(); //Возможно, максимальный идентификатор? Согласно вашему заявлению выше
Но 77 является «последним» значением опции для user_id 2, option_id 4. MySQL не может выбирать на основе позиции или порядка записи в таблицу, только на основе значений.
Предполагая, что таблица является пользовательской, и учитывая, что $id
является динамическим. Может ты имеешь в виду вот это:
$user = User::where('user_id', $id)
->orderBy('id', 'DESC')
->get();
И, наконец, используйте этот код $user->unique('option_id')
, чтобы получить фактический результат.
Привет, выбран последний идентификатор, а не последний идентификатор каждого option_id.
@JDoe, вы имеете в виду получение последней записи на основе option_id? Я сделал правку, не могли бы вы проверить.
Боюсь, это не то, чего я хотел. Я добавил описание к своему вопросу. В основном я хочу вернуть самый высокий (последний/самый новый) из каждого option_id (всего одну запись) для user_id 2, например. Учитывая, что есть 6 option_id, я ожидаю, что 6 записей будут возвращены только с последними значениями.
@JDoe, не могли бы вы попробовать мой отредактированный код. Я думаю, это сработает
спасибо, но ничего хорошего, ваше решение возвращает коллекцию всех option_id, а не только последние.
@JDoe, братан, можешь попробовать обновленный пост. и дайте мне знать проблему.
Если ваша таблица называется user_options, вот запрос Eloquent для выбора записей, которые вы ищете.
$getValues = DB::table('user_options')
->join(DB::raw('(SELECT max(user_options.id) FROM user_options INNER JOIN (
SELECT option_id, user_id FROM user_options GROUP BY option_id, user_id) sets
WHERE user_options.option_id = sets.option_id AND user_options.user_id = sets.user_id
GROUP BY user_options.option_id, user_options.user_id
) valuerecords'),
function($join)
{
$join->on('user_options.id', '=', 'valuerecords.id');
})->select(
'id',
'option_id',
'user_id',
'value'
)->get();
Необработанный запрос на выборку получает идентификаторы последних записей, а затем присоединяется к таблице для получения записей.
Обратите внимание, что «последняя» запись — это запись с самым высоким идентификатором, поэтому она захватит запись 77, а не 75. Если вы определяете последнюю по-другому, вы можете соответствующим образом изменить необработанный запрос.
Оказывается, это было так просто:
$options= DB::table('options')
->where('user_id', Auth::getUser()->id)
->groupBy("option_id")
->orderBy("option_id", "DESC")
->get();
Но пришлось установить строгий режим на false для этого запроса и вернуть его на true после извлечения данных.
Перед запросом:
// turn off strict mode for the below query
config()->set('database.connections.mysql.strict', false);
\DB::reconnect(); //important as the existing connection if any would be in strict mode
и после запроса:
//now changing back the strict ON
config()->set('database.connections.mysql.strict', true);
\DB::reconnect();
Можете ли вы объяснить, что вы спрашиваете? Последняя запись для user_id 2 имеет идентификатор 76. Непонятно, что вы хотите выбрать.