Mysql返回2个链接的项目,按创建顺序排序并按表ID分组

时间:2015-05-14 18:36:49

标签: php mysql laravel-4

一直试图想出最好的方法来做到这一点,但到目前为止,我一直很难过。

基本上在1个查询中,我想从2个表中获取数据,但是以非正统的方式限制它们。

table1table2的父级。我需要为每1 table2行返回2 table1行。

所以在数据中它看起来像这样:

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,按创建日期对项目进行排序,并按{{{ 1}} id。

我正在使用Laravel,但我知道这是使用table1的情况,这是我得到的概念。

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'); 项目中的2个,但从来没有尝试过故意创建重复项目,我觉得这完全是错误的如何去做。

有人对此有任何想法吗?

哦,还要解释为什么我没有使用这个模型。目前这可以使用普通的Eloquent模型,但是Eloquent会在php端执行多个查询和处理数据,这个特定的查询会产生很多数据,所以为了保持高效,我想尝试在1个查询中完成所有操作(并且它击中了php max执行时间)。

以下是最终输出的示例

table1

所以"子项"基本上是日志,他们跟踪"工作"完成该项目,我需要获取当前和前一个报告,但是使用我现在的测试数据,即1页加载中的大约20,001个查询。

2 个答案:

答案 0 :(得分:1)

所以我尝试的这个解决方案非常不合适。我不相信你按照设计的方式使用查询,这就是最大的问题。您应该考虑以与当前跟踪的数据不同的方式跟踪此数据。

我会按照updated_at作为元素的最新更新来执行某些操作。然后我会有一个历史表,只根据id记录前一个项目。如果您需要保存更多数据,那么很可能继续将数据输入到此历史记录中,但您只需要提取最新的ID。可以理解的是,您有大量的预定义数据,但如果您可以更改它,这是我会认真考虑的路线。

我没有看到解决方案的问题是:

  • 无法限制查询的方式只能获得由X定义的2行,而直到X结束,我们所讨论的可以在PHP中完成,所以它似乎有效!
  • 很可能发生低效率。 显然预期 <击>
  • <击>
  • 失去逻辑。 (不是100%肯定你为什么这样开始)

我希望自己可以提供更多帮助,但我无法在SQL 参数中找到解决方案,或者在PHP 中有效循环,以保持您定义的结构并获得正确的结果结果。

如果使用PHP,循环效率会不高,但它会是正确的。您找到了一个适合您标准的解决方案。

$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'))
    ...

我没有机会尝试这个,但是你可以在执行中使用这个原始查询,看看它是否做得正确。这应该涵盖它,但我相信你是正确的,常规的查询构建将无法正确执行此操作。

答案 1 :(得分:1)

我一直在HeidiSQL中玩,以获得有效的查询,这似乎足够接近我可以使用。

select 
    distinct `table2`.`created_at`, 
    `table2`.`points`,
    `table1`.`id`
from `table2`
inner join `table1`
on ( `table1`.`id` = `table2`.`part_id` )

它不限于2,但很简单,它应该快速运行。

最初我有一个子查询,但我意识到如果我删除限制连接表结果的想法就没有必要。