按另一张桌子的数量排序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按另一张桌子的数量排序?相关的知识,希望对你有一定的参考价值。

我有一张名为user_room_vists的桌子,用于存储每个用户所做房间的访问。这是该表的结构以及我如何在自己的数据库中创建它。

DROP TABLE IF EXISTS `user_room_visits`;
CREATE TABLE `user_room_visits` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `room_id` int(10) unsigned NOT NULL,
  `entry_timestamp` double NOT NULL,
  `exit_timestamp` double NOT NULL,
  `hour` int(11) NOT NULL,
  `minute` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  KEY `entry_timestamp` (`entry_timestamp`),
  KEY `exit_timestamp` (`exit_timestamp`)
) ENGINE=InnoDB AUTO_INCREMENT=73 DEFAULT CHARSET=latin1;

然后我有一个名为users的表,它显然拥有用户。我正在尝试(按最高顺序)选择用户进行的房间访问次数。

这意味着我必须将user_id中的user_room_visits列与id表中的users列匹配,但因为它在一个单独的表中变得复杂。

我没有任何例子向你展示我尝试过的东西,因为我被卡住了,每次我谷歌这都会出现一些我无法解决自己问题的事情,而且事实上我只是不知道我需要做些什么才能实现这一目标。我还需要使用其ORM Equolent在Laravel框架中执行此操作,这使得查询变得更加容易,因此我需要的不仅仅是mysql

这是模型文件

class UserRoomVisit extends Model

    protected $table = 'user_room_visits';
    public $timestamps = true;
    protected $guarded = ['id'];


class User extends Authenticatable

    protected $table = 'users';
    public $timestamps = true;
    protected $guarded = ['id'];

    public function userStats() 
        return $this->belongsTo(UserStats::class, 'id');
    

答案

看起来你不想在这里使用多对多的关系。因此,在userRoomVisits模型中定义Room关系:

public function userRoomVisits()

    return $this->hasMany(UserRoomVisit::class);

并使用像这样的withCount()方法来获得房间:

Room::withCount(['userRoomVisits' => function($q) 
        $q->where('user_id', auth()->id());
    ])
    ->latest('user_room_visits_count')
    ->get();

更新

评论中提到的另一个问题的代码:

User::withCount('userRoomVisits')->latest('user_room_visits_count')->take(5)->get();

User模型中定义关系:

public function userRoomVisits()

    return $this->hasMany(UserRoomVisit::class);

以上是关于按另一张桌子的数量排序?的主要内容,如果未能解决你的问题,请参考以下文章

将一列的多个结果行连接成一个,按另一列分组[重复]

如何在按另一列排序时按一列过滤?

SQL查询 - 按另一列排序一组列

按列分组,结果限制并按另一列轨道排序

SQL Server:按分组列求和并按另一列排序

SQL选择表中具有最大值的行,按另一列排序