【问题标题】:How to convert this sql query into laravel query builder?如何将此 sql 查询转换为 laravel 查询生成器?
【发布时间】:2019-09-08 12:27:15
【问题描述】:

我有一个表(itemregistrationpangkat),其中包含名称(从其他表 itemregistrations 加入)、negeri(从名为 negeri 的其他表加入)以及开始服务和结束服务的年份。我想得到一个人在一个州服务的年数:

  ID | Name     | negeri   |   yearstart     |    yearend
  -----------------------------------------------------------
  1  | Tom      | Kedah   |      2001       |      2002
  1  | Tom      | Kedah   |      2003       |      2007
  2  | Anne     | Melaka  |      2008       |      2012
  2  | Anne     | Melaka  |      2013       |      2018
  3  | Bill     | KL      |      2000       |      2001

我不得不问别人如何编写 SQL 语句来查询信息。这是 SQL 语句,其工作原理类似于小提琴 http://sqlfiddle.com/#!9/9029438/4(this 小提琴假定 negeri 和 name 列在同一个表中):

  select m.id,m.name,m.state,sum(m.duration) 
    from (select ID,Name,state,yearend-yearstart as duration from itemregistrationpangkat)m 
    group by  m.id,m.state,m.name;

我需要将sql语句修改为具有原始数据库结构的laravel sql格式。我已尝试使用以下代码。由于是使用 if 语句搜索函数,所以比较冗长:

  $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_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 (SELECT itemregistrationpangkat.itemRegistrationID, itemregistrationpangkat.yeartamatkhidmat - itemregistrationpangkat.yearmulakhidmat as duration FROM itemregistrationpangkat) as m"))
      ->groupBy(DB::raw("m.ItemRegistrationID"));

我尝试修改“tempoh_negeri”请求选择,它可以正常工作,但仍然没有得到所需的结果。

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

结果以 json 格式发送以使用 ajax 显示。它显示错误 500,因为查询未按预期工作。

调试器显示此错误:

   Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'from `itemregistrations` 
   inner join `sections` on `itemregistrations`.`SectionID' at line 1 (SQL: 
   select m.ItemRegistrationID, sum(m.duration) 
   from (SELECT itemregistrationpangkat.itemRegistrationID, itemregistrationpangkat.yeartamatkhidmat - itemregistrationpangkat.yearmulakhidmat as duration 
   FROM itemregistrationpangkat) as m 
   from `itemregistrations` 
   inner join `sections` on `itemregistrations`.`SectionID` = `sections`.`SectionID` 
   inner join `categories` on `itemregistrations`.`CategoryID` = `categories`.`CategoryID` 
   inner join `operasi` on `itemregistrations`.`OperasiID` = `operasi`.`OperasiID`  
   inner join `negeri` on `itemregistrations`.`NegeriID` = `negeri`.`NegeriID` 
   inner join `gred` on `itemregistrations`.`GredID` = `gred`.`GredID` inner join `itemregistrationpangkat` on `itemregistrationpangkat`.`itemRegistrationID` = `itemregistrations`.`itemRegistrationID` 
   where `itemregistrations`.`statusProID` = 1 and `itemregistrations`.`CategoryID` = 1 and `itemregistrations`.`OperasiID` = 9 and `itemregistrationpangkat`.`NegeriID` = 2 group by m.ItemRegistrationID)

组合这些 SQL 查询的正确语法是什么?

【问题讨论】:

  • 您是否为您的应用程序创建了模型(例如Section)?
  • 是的,但我不使用 eloquent
  • 你能用你的模型更新你的问题吗
  • 我已经更新了我的问题,希望你的建议不会使用雄辩。谢谢
  • 你最终得到了SELECT ... FROM ... FROM ... JOIN ...——只有一个FROM,其余的需要是JOIN。或者......也许你想要一个子查询??

标签: mysql laravel-5 select group-by laravel-query-builder


【解决方案1】:

我使用 Laravel SQL 来获取每个 itemregistrationID 的持续时间总和组:

   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') 
                  ->havingRaw('sum(m.duration) >= ?', [request('tempoh_negeri')]);
  }

【讨论】:

  • 结果是通过 distinct 和 group by 功能正确删除重复。
  • 否决这个回答一个不清楚和绝对无用的问题,应该删除。只有 OP 有解决这个“问题”的信息。
猜你喜欢
  • 2017-06-01
  • 2021-08-07
  • 2015-12-13
  • 2023-01-14
  • 2021-04-30
  • 1970-01-01
  • 2019-10-14
  • 2019-06-21
  • 1970-01-01
相关资源
最近更新 更多