【问题标题】:How to get the max ID in a Join Query in Laravel 5 (Integrity constraint violation:)如何在 Laravel 5 的联接查询中获取最大 ID(违反完整性约束:)
【发布时间】:2016-02-18 07:05:41
【问题描述】:

我的查询是这样的:

$deals=DB::table('leadsheet')
            ->join('Deal', 'leadsheet.leadcode', '=', 'Deal.leadcode')
             ->join('benefits', 'leadsheet.leadcode', '=', 'benefits.leadcode')
             ->join('delegatedealinfo', 'leadsheet.leadcode', '=', 'delegatedealinfo.leadcode')
              ->join('vipbooking', 'leadsheet.leadcode', '=', 'vipbooking.leadcode')
             ->where('id', DB::raw("(select max(`id`) from vipbooking)"))
           ->where('leadsheet.leadcat', '=','Delegates')

            ->get();

所以我有以下表格:

1.leadsheet 
   -- leadcode
   -- leadcat
2.Deal
   -- leadcode
3.benefits
   -- leadcode
4.delegatedealinfo
   -- leadcode
5.vipbooking
   -- leadcode

我要做的是获取vipbooking 表单的所有最大ID,其中leadcode 与所有leadcode FROM leadsheet WHERE leadsheet.leadcat=Delegates 相同

我唯一的问题是MAX IDvipbooking 表单不起作用

谁能帮帮我

更新1

应用@anant提供的解决方案后

错误

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous (SQL: select * from `leadsheet` inner join `Deal` on `leadsheet`.`leadcode` = `Deal`.`leadcode` inner join `benefits` on `leadsheet`.`leadcode` = `benefits`.`leadcode` inner join `delegatedealinfo` on `leadsheet`.`leadcode` = `delegatedealinfo`.`leadcode` inner join `vipbooking` on `leadsheet`.`leadcode` = `vipbooking`.`leadcode` where `id` = (select MAX(id) AS vipid from vipbooking) and `leadsheet`.`leadcat` = Delegates)

改写问题

我想获取代表用户的交易的vipbooking表单的详细信息,我们可以从Leadsheet表中找到交易是供应商还是代表

领导表

id | leadcode | leadcat

1  | DL2016012| Delegates
2  | DL2016013| Delegates
3  | VL2016001| Vendors
4  | VL2016002| Vendors

交易

id | leadcode | DealAmount

1  | DL2016012| 123
2  | VL2016002| 1000
2  | DL2016013| 1200

贵宾预订

    id | leadcode | date      | bookingtxt

    1  | DL2016012| 20-04-2016| xxx
    2  | DL2016012| 20-04-2016| dddd
    3  | VL2016012| 21-04-2016| ppp
    4  | DL2016013| 20-04-2016| xxx
    5  | DL2016013| 22-04-2016| dddd

所以我的输出应该有

 2 123 | Delegates| DL2016012| 20-04-2016| dddd
 5 1200| Delegates| DL2016013| 22-04-2016| dddd

谢谢

【问题讨论】:

  • @Anant 你是 Laravel 开发者吗? ,我想要一个使用 RelationShip 方式向模型添加方法来解决这个问题的答案,它的执行速度更快,但我现在仍然要尝试这个。
  • @Anant 我遇到了一些错误我已经用错误更新了我的问题请看一下
  • @Anant yes id 在那里,我也尝试过添加反勾号,但它也不起作用
  • @Anant SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous (SQL: select * from leadsheet` 内连接 Deal on leadsheet.leadcode = Deal.leadcode 内连接 benefits on leadsheet.@987654 benefits.leadcode 内连接 delegatedealinfo leadsheet.leadcode = delegatedealinfo.leadcode 内连接 vipbooking leadsheet.leadcode.leadcode = @98764354@9876 id = (select MAX(vipbooking.id) AS vipid from vipbooking) and leadsheet.leadcat = Delegates)`
  • @Anant 是的,我试过了

标签: php mysql eloquent laravel-5.1 has-many


【解决方案1】:

您可以尝试使用这两个查询。

$vipBookingMaxId = DB::table('vipbooking')
        ->select(DB::raw("MAX(`id`) AS maxId"))
        ->get();
$maxId = (null != $vipBookingMaxId) ? $vipBookingMaxId->maxId : 0;
$dealsQuery = DB::table('leadsheet')
        ->join('Deal', 'leadsheet.leadcode', '=', 'Deal.leadcode')
        ->join('benefits', 'leadsheet.leadcode', '=', 'benefits.leadcode')
        ->join('delegatedealinfo', 'leadsheet.leadcode', '=', 'delegatedealinfo.leadcode')
        ->join('vipbooking', 'leadsheet.leadcode', '=', 'vipbooking.leadcode');

if ($maxId) {
    $dealsQuery->where('id', $vipBookingMaxId->maxId);
}

$deals = $dealsQuery->where('leadsheet.leadcat', '=', 'Delegates')->get();

希望对你有帮助。

【讨论】:

    【解决方案2】:

    试试这个

    $deals=DB::table('leadsheet')
                ->join('Deal', 'leadsheet.leadcode', '=', 'Deal.leadcode')
                 ->join('benefits', 'leadsheet.leadcode', '=', 'benefits.leadcode')
                 ->join('delegatedealinfo', 'leadsheet.leadcode', '=', 'delegatedealinfo.leadcode')
                  ->join('vipbooking', 'leadsheet.leadcode', '=', 'vipbooking.leadcode')
                 ->where('leadsheet.id', DB::raw("(select max(`id`) from vipbooking)"))
               ->where('leadsheet.leadcat', '=','Delegates')
    
                ->get();
    

    已添加leadsheet.id

    【讨论】:

    • 我试过了,但我不得不将 leedsheet.id 更改为 vipbooking.id bcoz 我想要那个的最大 id,但我仍然只得到一个结果,虽然我应该得到两个结果,仍然感到困惑为什么会这样
    猜你喜欢
    • 2016-05-25
    • 2015-07-17
    • 2019-04-12
    • 1970-01-01
    • 2016-11-22
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多