假设我有一个这样的表:
id user_id status updateded_id
1 1 yes 2/5/2013
2 2 no 2/1/2013
3 3 yes 1/28/2013
4 2 yes 1/24/2013
5 2 no 1/20/2013
6 1 yes 1/16/2013
7 3 no 1/12/2013
8 4 yes 1/8/2013
9 5 yes 1/4/2013
10 5 no 12/31/2012
11 6 yes 12/27/2012
12 7 no 12/23/2012
13 6 yes 12/19/2012
14 4 yes 12/15/2012
15 3 no 12/11/2012
16 3 yes 12/7/2012
17 1 no 12/3/2012
18 1 yes 11/29/2012
我需要编写一个查询,仅当最新 updated_id
的状态为“yes”时才选择 user_id
。
例如,将选择 user_id
1,而不会选择 user_id
2。
我在复杂的 Larvel 查询生成器(Larvel 版本 4.2)中编写了此代码。
结果是多个用户。 因此,在此查询中,仅当状态表中最后一次出现的情况为"is"时,才应选择用户一次。
我尝试过:
$query->join('mytable', function ($join) use ($statuses) {
->whereRaw('mytable.status in ('.$statuses.') )
->orderBy('mytable.updated_at', 'desc')
->limit(1);
});
并且:
$query->join('statuses', function ($join) use ($statuses) {
->whereIn('mytable.status ,$statuses )
->orderBy('mytable.updated_at', 'desc')
->limit(1);
});
whereIn 和 whereRaw 函数出现错误。就像它们不存在一样。
所以,进步了。通过此查询,我可以找到一个用户的最新状态为"is"。我找不到一种方法让它通过这种逻辑选择所有用户:
SELECT s1.user_id
FROM statuses s1
WHERE s1.user_id = ( SELECT user_id
FROM statuses s2
WHERE s2.status IN ('yes', 'no') ORDER BY s2.updateded_id DESC LIMIT 1)
AND s1.status= 'yes';
最佳答案
你可以这样做。
一个用户有多个状态,您想根据最新的状态获取用户,对吧?
Eloquent 用户模型
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
/*
* Get the user's statuses
*/
public function statuses()
{
return $this->hasMany(Status::class);
}
/**
* Get the user's latest status.
*/
public function latestStatus()
{
return $this->hasOne(Status::class)->latestOfMany('updated_at');
}
}
然后你可以像这样编写查询
return User::whereHas('latestStatus', function($query) {
$query->where('status', 'yes');
})->get();
关于MySQL 选择状态数组中的位置和最后一次出现等于特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71666762/