выберите строку для значения каждого столбца - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть условие, и я хочу использовать mysql временные таблицы.

У меня есть Задачи таблица и Задания таблица.

Задачи имеют отношение «один ко многим» с заданиями (каждая задача имеет одно или несколько заданий).

Я хочу выбрать Последнее задание для каждой задачи в запросе (на основе столбца созданного_каталога).

этот запрос работает нормально:

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()

, если кто-нибудь может дать мне руку или подсказку, это будет полезно.

Спасибо.

1 Ответ

1 голос
/ 04 февраля 2020

Вы можете создать представление в миграции, обратите внимание, что вы должны явно объявить имя каждого столбца (с псевдонимом, если это неоднозначное имя).

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();
...