【问题标题】:select a row for each column`s value为每一列的值选择一行
【发布时间】:2020-05-20 03:48:14
【问题描述】:

我有一个条件,我想使用 mysql 临时表。

我有 Tasks 表和 Jobs 表。

tasks与jobs有一对多的关系(每个task有一个或多个jobs)

我想选择查询中每个任务的Last Job(基于 created_at 列)。

这个查询工作正常:

SELECT * 
  FROM tasks t
  join jobs j
    on t.id = j.task_id 
   and j.id = ( select id 
                  from jobs 
                 where jobs.task_id = t.id 
                   and jobs.deleted_at is null 
                 order 
                    by id desc 
                 limit 1
              ) 
 order 
    by j.created_at desc;

但我想使用更灵活的东西,比如 mysql 临时表:

CREATE TEMPORARY TABLE last_jobs SELECT * from jobs where ...

如果有任何内置函数或类似功能,请使用 laravel elequent 和查询构建器:

Task::select('tasks.*,jobs.*')->join('jobs')->where()

如果有人可以帮助我或提供线索,那将很有帮助。

谢谢。

【问题讨论】:

  • 临时表有什么了不起的?
  • 在 laravel 查询生成器中进行子查询变得困难。和嵌套块。但是使用临时表我可以避免嵌套并编写更清晰的代码。并让使用查询构建器库变得更容易。
  • 所以也许你的问题真的是关于避免子查询。好吧,我认为这是一个错误,因为在这种情况下子查询可能更有效(尽管可能不是这个精确的子查询)
  • 当然。避免子查询:)
  • 最后我做到了,它工作正常:DB::statement("CREATE TEMPORARY TABLE last_jobs SELECT jobs.* from jobs join tasks on tasks.id=jobs.task_id and jobs.id=(select id from jobs where jobs.task_id=tasks.id and `jobs`.`deleted_at` is null order by `id` desc limit 1);"); 和未来:$query = Task::select("tasks.*")->join("last_jobs","tasks.id","last_jobs.task_id"); 在我的 php 代码中。

标签: mysql laravel eloquent laravel-query-builder


【解决方案1】:

您可以在迁移中创建视图,注意您应该显式声明每个列名(如果名称不明确,则使用别名)。

class CreateLastJobsView extends Migration {
   public function up() {
    DB::statement("CREATE VIEW last_jobs AS
       SELECT t.id as task_id, j.id as job_id, ...  
       FROM tasks t
       join jobs j
         on t.id = j.task_id 
       and j.id = ( select id 
                  from jobs 
                 where jobs.task_id = t.id 
                   and jobs.deleted_at is null 
                 order 
                    by id desc 
                 limit 1
              ) 
        order by j.created_at desc");
  }

  public function down()  {
    DB::statement('DROP VIEW last_jobs');
  }  

}

然后你就可以把视图当作普通的表来使用了:

DB::table('last_jobs')->select('task_id')->first();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2018-03-04
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多