第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Laravel 實(shí)現(xiàn)最大 n-per-group

Laravel 實(shí)現(xiàn)最大 n-per-group

PHP
桃花長相依 2021-11-26 19:21:54
用戶表:| id |       name | age ||----|------------|-----||  1 |      Apple |  22 ||  2 | Strawberry |  23 ||  3 |     Orange |  50 ||  4 |      Mango |  30 |會員表:| id | user_id |            expire_at ||----|---------|----------------------||  1 |       1 | 2019-08-17T11:19:30Z ||  2 |       1 | 2019-08-10T11:20:10Z ||  3 |       2 | 2019-08-29T11:20:19Z ||  4 |       3 | 2019-08-02T11:20:30Z ||  5 |       3 | 2019-08-28T11:20:40Z |問題我想要選擇具有最新“expire_at”的用戶。參考:https : //stackoverflow.com/a/2111420/5588637 后,我嘗試了以下操作:SELECT    u.*,    m1.* FROM    users u    INNER JOIN memberships m1 ON u.id = m1.user_id    LEFT JOIN memberships m2 ON u.id = m2.user_id     AND (         m1.expire_at < m2.expire_at         OR m1.expire_at = m2.expire_at         AND m1.id < m2.id         ) WHERE    m2.id IS NULL;結(jié)果的id,因?yàn)槲以?jīng)將出現(xiàn)兩次join。| id |       name | age | id | user_id |            expire_at ||----|------------|-----|----|---------|----------------------||  1 |      Apple |  22 |  1 |       1 | 2019-08-17T11:19:30Z ||  2 | Strawberry |  23 |  3 |       2 | 2019-08-29T11:20:19Z ||  3 |     Orange |  50 |  5 |       3 | 2019-08-28T11:20:40Z |更改 m1.*為 后m1.expire_at。我得到了我想要的結(jié)果。| id |       name | age |            expire_at ||----|------------|-----|----------------------||  1 |      Apple |  22 |  2019-08-17T11:19:30Z||  2 | Strawberry |  23 | 2019-08-29T11:20:19Z ||  3 |     Orange |  50 | 2019-08-28T11:20:40Z |在線試用:http : //sqlfiddle.com/#!9/27fa22/4在 Lavavel 中實(shí)現(xiàn)Laravel 框架版本:5.6.39比較結(jié)果,Laravel 結(jié)果缺少第二個 id,即成員資格表 id,我想這是結(jié)果不正確的原因。我在網(wǎng)上搜了一下,好像是這個問題。 https://github.com/laravel/framework/issues/4962但是經(jīng)過各種嘗試我都失敗了......
查看完整描述

2 回答

?
德瑪西亞99

TA貢獻(xiàn)1770條經(jīng)驗(yàn) 獲得超3個贊

您不能在 Laravel 中選擇具有相同名稱的兩行。第二個將覆蓋第一個。請改用別名。


$users = DB::table('users as u')

            ->select('u.*', 'm1.id as membership_id')

            ->join('memberships as m1','u.id','=','m1.user_id')

            ->leftJoin('memberships as m2', function($join){

                $join->on('u.id', '=', 'm2.user_id')

                    ->where(function ($query) {

                        $query->whereColumn('m1.expire_at','<','m2.expire_at')

                            ->orWhere(function ($query) {

                                $query->whereColumn('m1.expire_at','=','m2.expire_at')

                                    ->whereColumn('m1.id','<','m2.id');

                            });

                    });

            })

            ->whereNull('m2.id')

            ->get();

注意:我還在連接中封裝了orWhere(),以避免混淆 AND/OR 的順序。


同樣有效的是在選擇中使用不同的順序。例如,您可以使用以下內(nèi)容:


$query->select([

    'm1.*',

    'm1.id as membership_id',

    'u.*'

])

它將返回兩個表的所有列以及新membership_id列。但是如果users表上有一列的名稱與表上的列相似memberships,則只users返回表列(例如created_at)。返回列表中最后一個。


查看完整回答
反對 回復(fù) 2021-11-26
?
肥皂起泡泡

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超6個贊

編輯:


正如@Namoshek 所提到的,您不應(yīng)該選擇所有內(nèi)容,因?yàn)槟?SQL 查詢中存在重復(fù)鍵問題。我修改了我的答案,使其與@RaymondNijland 的答案相匹配。順便說一句,即使對于表用戶,您也應(yīng)該準(zhǔn)確地選擇您需要的內(nèi)容。不僅針對重復(fù)鍵問題,還針對 SQL 查詢的速度。我們考慮得還不夠多,但它可以很快對大量結(jié)果產(chǎn)生影響。


從數(shù)據(jù)庫發(fā)送到 PHP 服務(wù)器的數(shù)據(jù)更少 = 更快


你應(yīng)該試試這個:


DB::table('users as u')

            ->select('u.*', 'm1.id as membership_id')

            ->join('memberships as m1','u.id','=','m1.user_id')

            ->leftJoin('memberships as m2', function ($join) {

                $join->on('u.id', '=', 'm2.user_id')

                    ->on(function($join) {

                        $join->on('m1.id', '<', 'm2.id')

                            ->on(function($join) {

                                $join->on('m1.expire_at', '<', 'm2.expire_at')

                                    ->orOn('m1.expire_at', '=', 'm2.expire_at');

                            });

                    });

            })

            ->whereNull('m2.id')

            ->toSQL()

如本頁 Laravel 文檔中所述:https ://laravel.com/api/5.8/Illuminate/Database/Query/JoinClause.html#method_on


您可以將閉包傳遞給該on()方法,并且orOn()您可以在此閉包中使用該方法。


我測試了它,它給出了與您的 SQL 查詢相同的結(jié)果。


查看完整回答
反對 回復(fù) 2021-11-26
  • 2 回答
  • 0 關(guān)注
  • 193 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號