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

Posted

技术标签:

【中文标题】按另一张桌子的数量排序?【英文标题】:Ordering by the count of another table? 【发布时间】:2018-08-11 11:48:26 【问题描述】:

我有一个名为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_room_visits 中的user_id 列与users 表中的id 列相匹配,但是因为它位于单独的表中,所以变得复杂。

我没有任何示例可以向您展示我尝试过的事情,因为我被卡住了,每次我在谷歌上搜索它都会提出一些我无法用自己的问题来形容的东西,那个和事实上,我只是不知道我需要做什么才能实现这一目标。我还需要在 Laravel 框架中使用它的 ORM Equolent 来执行此操作,这使得查询变得更加容易,所以我需要的不仅仅是 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');
    

【问题讨论】:

模型文件的内容是什么?你定义了那里的关系吗? @UdayrajDeshmukh 我刚刚用模型文件更新了我的问题。 @0b9ff4fb 你能用一些示例数据解释一下你想要什么吗? 我无法收集User 模型的集合,按user_room_visits 中的房间访问次数降序排列,限制为5。 假设users 表有一个名为room_visits 的列,我会这样做:User::orderBy('room_visits', 'DESC')->limit(5)->get();,但它没有......所以我需要做一些更复杂的事情。 【参考方案1】:

看起来您不想在这里使用多对多关系。所以,在Room 模型中定义userRoomVisits 关系:

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();

更新

在 cmets 中提出的另一个问题的代码:

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

User 模型中定义关系:

public function userRoomVisits()

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

【讨论】:

我正在尝试收集User 模型,而不是Room 模型。 @0b9ff4fb 您最初的问题是“我正在尝试选择(按最高顺序)用户进行的房间访问次数”。但是,如果您想通过room_id 获取用户,请更改代码。这绝对是相同的原理,相同的关系但在另一个模型中定义,相同的代码具有交换关系等。 您的回答有问题,首先它没有按计数顺序排列集合,其次您的代码中有错误(附近 -> 哪里,意外->)最后你没有给关系hasMany 一个列名。 我已经修好了第二个,谢谢。另外,我很确定它按数量排序房间,我在许多应用程序中都使用过该代码。而且您也不需要指定hasMany 列名,因为您在我的仓库中描述了following Laravel model naming conventions。 运行代码时出现错误mb_strpos() expects parameter 1 to be string, object given,另一个问题是当您应该传递当前用户模型的ID 时传递auth()->id()

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

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

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

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

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

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

pandas 按另一列的平均值对一列的值进行排序