Как получить другое значение столбца в другой таблице в запросе? - PullRequest
3 голосов
/ 26 апреля 2019

У меня был поиск приложения, поиск личной информации, которая была отфильтрована по некоторым критериям (категория, годы опыта и т. Д.)

У меня была проблема с последним фильтром, «tempoh perkhidmatan by negeri».Мне нужно рассчитать количество опыта работы по штатам (негери).Например, при поиске людей в возрасте 5 лет в штате (negeri) 'x', sql будет суммировать годы опыта каждого человека в выбранном государстве.

Это полный код поиска SQL по критериям:

   $query = DB::table('itemregistrations')
                ->join('sections', 'itemregistrations.SectionID', '=', 'sections.SectionID')
                ->join('categories', 'itemregistrations.CategoryID', '=', 'categories.CategoryID')
                ->join('operasi', 'itemregistrations.OperasiID', '=', 'operasi.OperasiID')
                ->join('negeri', 'itemregistrations.NegeriID', '=', 'negeri.NegeriID')
                ->join('gred', 'itemregistrations.GredID', '=', 'gred.GredID')
                ->where('itemregistrations.statusProID', '=', 1)
                ->select('itemregistrations.name','sections.sectionname', 'categories.categoryname', 'operasi.operasiname', 'itemregistrations.Nobadan', 'itemregistrations.lahir_yy', 'itemregistrations.pdrm_yy', 'gred.namagred', 'itemregistrations.itemRegistrationID', '');

        if($request->input('negeri_lahir') != ''){
            $query->where('itemregistrations.NegeriID', $request->input('negeri_lahir'));
        }

        if($request->input('kategori') != '') {
            $query->where('itemregistrations.CategoryID', $request->input('kategori'));
        }

        if($request->input('pangkat') != '') {
            $query->where('itemregistrations.OperasiID', $request->input('pangkat'));
        }

        if(request('umur')) {
            $query->whereRaw('YEAR(CURDATE()) - lahir_yy >= ?', [request('umur')]);  
        }

        if($request->input('gred') != '') {
            $query->where('itemregistrations.GredID', $request->input('gred'));
        }

        if(request('tempoh')) {
            $query->whereRaw('YEAR(CURDATE()) - pdrm_yy >= ?', [request('tempoh')]);  
        }

        if($request->input('negeri_perkhidmatan') != '') {
            $query->join('itemregistrationpangkat', 'itemregistrationpangkat.itemRegistrationID', '=', 'itemregistrations.itemRegistrationID')
                ->where('itemregistrationpangkat.NegeriID', $request->input('negeri_perkhidmatan'));           
        }

      if(request('tempoh_negeri')) {
            $query->select(DB::raw('m.itemRegistrationID, sum(m.duration)'))
                  ->from(DB::raw('(SELECT itemRegistrationID, NegeriID, yeartamatkhidmat - yearmulakhidmat as duration FROM itemregistrationpangkat) AS m 
                        RIGHT JOIN itemregistrations ON itemregistrations.itemRegistrationID=m.itemRegistrationID'))
                  ->distinct()
                  ->groupBy('m.itemRegistrationID');
      }

   $newitem = $query->get();

   return response::json($newitem);

Код, который необходимо решить, это (последний фильтр):

    if(request('tempoh_negeri')) {
            $query->select(DB::raw('m.itemRegistrationID, m.NegeriID, sum(distinct m.duration)'))
                  ->from(DB::raw('(SELECT itemRegistrationID, NegeriID, yeartamatkhidmat - yearmulakhidmat as duration FROM itemregistrationpangkat) AS m 
                  RIGHT JOIN itemregistrations ON itemregistrations.itemRegistrationID=m.itemRegistrationID'))
                  ->groupBy('m.itemRegistrationID', 'm.NegeriID'); 
      }

Проблема в том, что мне нужно получить столбец имени, столбец sectionID, CategoryID, OperasiID, NegeriID, GredID, из таблицы itemregistrations из оператора $ query.Как объединить последний фильтр запросов в 'tempoh_negeri' с предыдущим?

1 Ответ

2 голосов
/ 06 мая 2019

Я не знал, в частности, о Laravel, поэтому у меня было много проблем, пытаясь понять, как был построен ваш запрос, но этот синтаксис, кажется, позволяет людям писать запрос, добавляя куски, но не обязательно в правильном порядке. Итак, вот что, я полагаю, должен делать ваш запрос для докладчиков SQL:

SELECT itemregistrations .name,
       sections          .sectionname,
       categories        .categoryname,
       operasi           .operasiname,
       itemregistrations .Nobadan,
       itemregistrations .lahir_yy,
       itemregistrations .pdrm_yy,
       gred              .namagred,
       itemregistrations .itemRegistrationID
-- if($tempoh_negeri)           (request)
      ,m                 .itemRegistrationID,
       sum(m.duration)

  FROM itemregistrations
-- if($tempoh_negeri)           (request)
     ,(SELECT DISTINCT itemRegistrationID,
                       NegeriID,
                       yeartamatkhidmat - yearmulakhidmat as duration

         FROM itemregistrationpangkat) AS m

   RIGHT JOIN itemregistrations
           ON itemregistrations.itemRegistrationID = m.itemRegistrationID


  JOIN sections
    ON itemregistrations.SectionID = sections.SectionID

  JOIN categories
    ON itemregistrations.CategoryID = categories.CategoryID

  JOIN operasi
    ON itemregistrations.OperasiID  = operasi.OperasiID

  JOIN negeri
    ON itemregistrations.NegeriID   = negeri.NegeriID

  JOIN gred
    ON itemregistrations.GredID     = gred.GredID

-- if($negeri_perkhidmatan)
  JOIN itemregistrationpangkat
    ON itemregistrationpangkat.itemRegistrationID = itemregistrations.itemRegistrationID


 WHERE itemregistrations.statusProID = 1

-- if($negeri_lahir) (WHERE)
   AND itemregistrations.NegeriID           = $negeri_lahir

-- if($kategori)     (WHERE)
   AND  itemregistrations.CategoryID        = $kategori

-- if($pangkat)      (WHERE)
   AND itemregistrations.OperasiID          = $pangkat

-- if(umur)          (WHERERAW) (request)
   AND YEAR(CURDATE()) - lahir_yy          >= umur

-- if($gred)         (WHERE)
   AND itemregistrations.GredID             = $gred

-- if($tempoh)       (WHERERAW) (request)
   AND YEAR(CURDATE()) - pdrm_yy           >= tempoh

-- if($negeri_perkhidmatan)
   AND itemregistrationpangkat.NegeriID     = $negeri_perkhidmatan

-- if($tempoh_negeri)           (request)
GROUP BY m.itemRegistrationID

Если это так, вы не можете делать то, что хотите, следующим образом (включая основные столбцы в подзапросе), потому что ваш подзапрос будет оцениваться ДО того, как основной будет.

Вместо этого вам нужно написать надлежащий фильтр на уровне основного запроса, а именно: среди других уже существующих предложений «JOIN… ON». Что бы дать:

LEFT JOIN itemregistrationpangkat
       ON itemregistrationpangkat.itemRegistrationID = itemregistrations.itemRegistrationID

… затем укажите вычитание непосредственно в вашей sum() функции

          sum(yeartamatkhidmat - yearmulakhidma)

Что касается Лавареля, это, вероятно, даст что-то вроде:

 if(request('tempoh_negeri')) {
    $query->leftjoin('itemregistrationpangkat','itemRegistrationID','=','itemregistrations.itemRegistrationID');
    $query->select(DB:raw('sum(yeartamatkhidmat - yearmulakhidmat'));
 }
...