当前位置: 首页 > 知识库问答 >
问题:

使用Laravel查询生成器中的where子句获取最大日期列

商兴朝
2023-03-14

我有一个数据透视表,它介于用户订阅之间。以下是模式:

 Schema::create('users_subscriptions', function (Blueprint $table) {
            $table->bigInteger('user_id')->unsigned();
            $table->bigInteger('subscription_code_id')->unsigned()->nullable();
            $table->timestamps();
            $table->timestamp('expired_at')->nullable();

            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->foreign('subscription_code_id')->references('id')->on('subscription_codes')->onDelete('cascade');
        });

所以关系是多对多的,我需要寻找这个数据透视表来获取过期的订阅用户。这是我的查询生成器:

$query->select(self::columns())
                  ->join('users_subscriptions', 'users.id', '=', 'users_subscriptions.user_id')
                  ->where('users_subscriptions.expired_at', '<=', now())
                  ->groupBy('users.id')
                  ->orderBy('users_subscriptions.expired_at', 'asc')

透视表用户订阅的示例数据

问题是查询在透视表中查找第一条记录并对照它进行检查。我需要寻找最大expired_at并只检查。预期的结果是检查透视表中的第二行,因为它具有maxexpired_at值。因此,user_id1具有有效的订阅。

我认为我需要使用子查询,但不确定如何实现这一点。

非常感谢。

共有1个答案

姚文轩
2023-03-14

我认为这将返回您想要的:

SELECT user_id, MAX(expired_at) AS ed
FROM users_subscriptions
GROUP BY user_id
HAVING ed > NOW();

但我不确定如何以查询生成器格式编写它。我所做的是为每个id返回MAX(过期时间),然后将其分组为btid。我注意到您的查询生成器有users\u subscriptionsjoin withusers,但从create table语句判断,对users\u subscriptions运行此查询就足以获得过期日期值,我猜与users的join只是为了返回用户附加信息。groupby之后的下一个操作是have-这是在处过滤出过期的。请注意,由于我使用别名ed分配了MAX(expired_at),因此我在HAVING中重用了相同的别名。但是,我不确定查询生成器的行为是否可以接受,但如果不能接受,您可以更改为:

HAVING MAX(expired_at) > NOW()

P/S:其

这里有一把小提琴供参考:https://dbfiddle.uk/?rdbms=mysql_8.0

 类似资料:
  • 问题内容: 我正在尝试找出最有效(最佳性能)的方法来检查当前日期的日期字段。目前,我们正在使用: 问题答案: 编辑:正如对此答案的注释中所指出的那样,这不是理想的解决方案。还要检查该线程中的其他答案。

  • 问题内容: 我最近才刚开始使用SQLAlchemy,但仍无法解决某些概念。 归结为基本元素,我有两个这样的表(通过Flask-SQLAlchemy): 我将如何查询用户列表及其最新帖子(不包括无帖子的用户)。如果我使用的是SQL,则可以执行以下操作: 因此,我确切地知道“期望的” SQL可以达到我想要的效果,但是不知道如何在SQLAlchemy中“正确地”表达它。 编辑:如果很重要,我使用的是SQ

  • 问题内容: 我有以下只需1秒即可执行的sql查询: 但是我需要一个结果集来获取比率大于0的结果。因此,当我将查询更改为此时,需要7分钟的时间来执行: 为什么这会使查询时间从1秒增加到7分钟?由于b表很大,因此我什至尝试使用CTE,但这也没有提高性能。我认为使用CTE可以从中筛选出较小的一组值,因此应该更快一些,但这无济于事: 我不能包括执行计划,因为除了查询之外,我没有对数据库的权限。 问题答案:

  • 我正在尝试使用criteriaBuilder和谓词构建一个SQL where子句,以创建一些SQL语句,如: AND或对列表周围的括号对于将它们与不存在分开很重要。这是因为和有优先权我得到的是 我可以构建所有谓词,没有问题,但我不知道如何让它在AND或PAIRES列表中添加括号 AND或OR对的列表是这样构建成1个谓词列表的 子查询是这样添加的 还有地点 每个AND或AND对周围的括号也一样好

  • 问题内容: 我有一个查询: 我只想从表中选择周期和年份等于的行: 我知道最简单的方法是使用连接,但是问题是-在应用程序中,我只能在后面添加一个子句 因此,解决方案应该是: 那可能吗? 编辑: 结果应与以下相同: 问题答案: 您可以为条件使用多个列: 但是戈登的解决方案可能更快。

  • 我想在hibernate中选择最大日期,但出现以下错误: Java语言sql。SqlSyntaxerRorexException:ORA-00932:不一致的数据类型:预期的时间戳得到的数字 查询是: 数据库是oracle。数据库中该字段的类型为时间戳(6)