MySQL 选择状态数组中的位置和最后一次出现等于特定值

标签 mysql laravel inner-join exists groupwise-maximum

假设我有一个这样的表:

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/

相关文章:

mysql - 无法链接到 C++ 中已编译/.so 源库

php - Ajax MYSQL 搜索和排序结果

php - 将电子邮件地址插入数据库并检查它是否已存在

php - 在我的编辑器中管理上传文件的最佳方式?

mysql - mysql内连接和子字符串组合可能吗?

mysql - 如何在不搞砸第一个表中的总值的情况下对连接表中的值求和?

mysql - 在 SQL 中,如何只获取整个表的单个列中具有相同值的条目?

laravel - 我正在使用带有 redis 和 socket.io 的 laravel echo。存在和私有(private) channel 失败

php - mysql 错误 2003 [HY000] - 当我尝试连接到远程 mysql 时

mysql - 如何内连接3个表