【发布时间】:2014-08-12 23:36:27
【问题描述】:
我有一个消息表。
+----+---------+----------+
| id | conv_id | body |
+----+---------+----------+
| 1 | 1 | haha |
| 2 | 1 | blabl|
| ...| ... | ... |
| 25| 2 | hehe |
+----+---------+----------+
... = conv_id 为 2 或 1 或 3 或 n 的其余消息。
假设我有conv_id = array(2,1),并且我想在与conv_id 中的ID 数组匹配后获得10 条消息,所以我做到了
select * from `messages` where `conv_id` in (2, 1) order by `created_at` desc limit 10
上面的 sql 给了我 10 条消息在匹配 conv_ids 并获得 所有组合消息。然而,这不是我想要的。相反,我希望 每个 conv_id 匹配 10 条消息。
我如何获得 10 条消息每条 conv_id 匹配?请不要使用 PHP for 循环。谢谢!
注意:数组 conv_id 可以轻松扩展以包含许多其他彼此唯一的值,而不仅仅是 2s 或 1s。
P.s.,奖励积分为 Laravel Eloquent 回答!以下是详细信息:
- 两个模型,Conversations 和由 Conversations 链接的 Messages hasMany Message 和 Message belongsTo a Conversation。
- 我上面的sql翻译自
Messages::with('User')->whereIn('conv_id',$conv_id)->orderBy('created_at','desc')->take(10);
【问题讨论】:
-
一种方法是在两个查询之间使用
UNION,一个处理1s,另一个处理2s。 -
@JaredFarrish 对,等待您的答复。谢谢!
-
如果你只使用 SQL Server 或 Oracle,一个简单的分区就可以了。
-
这是an in-depth article 解释选项。请注意,没有一个解决方案特别优雅(都使用子查询、
UNION和/或变量),因为 SQL 中的 LIMIT 不能像这样工作。 -
这看起来很可疑:sqlfiddle.com/#!2/aefd7a/16 每次随机获取前十个以外的东西可能会更棘手。如果它总是返回相同的 10 也是不确定的,所以如果值只能被查询一次以对每个值进行分组(可能是某种
CROSS JOIN?),它可能会更一致地工作。
标签: php mysql laravel laravel-4 eloquent