[英]Mysql return 2 linked items, ordered by created and grouped by table id
一直在尝试思考实现此目的的最佳方法,但到目前为止,我一直很困惑。
基本上在1个查询中,我想从2个表中获取数据,但以非正统的方式限制它们。
table1
是table2
的父级。 我需要为每1个table1
行返回2个table2
行。
所以在数据中看起来像这样:
Row 1
Item 1
Item 2
Row 2
Item 1
Item 2
但是实际的mysql数据是这样的:
Row 1 Item 1
Row 1 Item 2
Row 2 Item 1
Row 2 Item 2
如果不限制每个table1
行中有多少个项目,这很容易,但是我需要将它们限制为2个,按创建日期对项目进行排序,并按table1
id对它们进行分组。
我为此使用Laravel,但我知道这是使用DB:raw
的情况,这是我所得到的概念。
$data = DB::table('table2')
->select('table2.data', 'table2.created_at')
->leftJoin('table1', 'table2.part_id', '=', 'table1.id')
->orderBy('table2.created_at')
->groupBy('table1.id');
我正在考虑做一个原始联接,并尝试对其执行一个表子查询,以返回每个table1
项的2个,但是从来没有尝试过故意故意创建重复项,我觉得这样做是完全错误的。
有人对此有任何想法吗?
哦,还要解释为什么我不为此使用模型。 目前,这可以使用普通的Eloquent模型工作,但是Eloquent会执行多个查询并在php端处理数据,该特定查询会产生大量数据,因此为了保持效率,我想尝试在1个查询中全部完成(及其达到php的最大执行时间)。
这是最终输出的示例
Item 1
previous (created at) - data
current (created_at) - data
Item 2
previous (created at) - data
current (created_at) - data
因此,“子项目”基本上是日志,它们跟踪对该项目完成的“工作”,我需要获取当前的和上一个报告,但是使用我现在拥有的测试数据(约1笔,约20001笔)页面加载。
因此,我尝试的此解决方案是非常不正确的。 我不相信您使用查询的方式来设计查询,这就是最大的问题。 您应该考虑与当前跟踪的数据不同地跟踪此数据。
我将按照updated_at
作为元素的最新更新来进行操作。 然后,我将有一个历史记录表,该表仅根据ID记录前一个项目。 如果您需要保存更多数据,则可以继续向该历史记录中输入数据,但是您只需要提取最新的ID。 可以理解,您有大量的预定义数据,但是如果可以更改它,这就是我会认真考虑的方法。
我看不到解决方案的问题是:
我希望我能提供更多帮助,但是我想不出SQL参数中的解决方案
或PHP中的有效循环
来保持定义的结构并获得正确的结果。
如果使用PHP,则循环效率不高,但这是正确的。 您找到了一种适合您的标准的解决方案。
\n
$data = DB::table('table2') ->select(DB::raw('SELECT table2.data,table2.created_at FROM table2 WHERE table2.part_id=table1.id ORDER BY table2.created_at DESC LIMIT 2')) ...
我没有机会尝试此操作,但是您可以在执行过程中使用此原始查询,看看它是否执行正确的操作。
这应该涵盖了它,但是我相信您是对的,常规的查询构建将无法正确执行此操作。
我一直在HeidiSQL中玩耍以获取有效的查询,这似乎已经足够我可以使用了。
select
distinct `table2`.`created_at`,
`table2`.`points`,
`table1`.`id`
from `table2`
inner join `table1`
on ( `table1`.`id` = `table2`.`part_id` )
它不限于2,但足够简单,应该可以快速运行。
最初,我有一个子查询,但是我意识到,如果我消除了限制联接表结果的想法,则不需要它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.