簡體   English   中英

如何使用Laravel通過查詢將2個表連接起來

[英]How to join 2 tables with group by query using laravel

我的數據庫中有一個用戶和聊天表。 這是我表中的一些示例數據:

用戶表:

id  |   name  |    avatar
1       john     default.png
2       mark       picture.jpg

聊天表:

   id  |   user_id  |  friend_id | message | status
    1        1           2           hello     0
    2        1           2           hi        1

狀態列的目的是確定是否已閱讀該消息。

  status 0 = unread message
  status 1 = read message

這是我的代碼,用於對所有未讀郵件進行分組和計數:

        $chat = DB::table('chats')
             ->join('users', 'users.id', '=', 'chats.user_id')
             ->select('user_id', DB::raw('count(*) as total'))
             ->where('friend_id', Auth::user()->id)
             ->where('status',0)
             ->groupBy('user_id')
             ->get();

這是我嘗試插入用戶頭像時的代碼,但出現此錯誤: users.avatar' isn't in GROUP BY

        $chat = DB::table('chats')
             ->join('users', 'users.id', '=', 'chats.user_id')
             ->select('users.avatar','user_id', DB::raw('count(*) as total'))
             ->where('admin_id', Auth::user()->id)
             ->where('status',2)
             ->groupBy('user_id')
             ->get();

我想要的也是獲取發送消息的用戶的化身。 我不知道如何構造查詢以獲取頭像列。 任何幫助,將不勝感激。 謝謝。

如果您按users表中的id進行GROUP BY ,則您也應該能夠在users表中選擇其他任何列:

$chat = DB::table('chats')
         ->join('users', 'users.id', '=', 'chats.user_id')
         ->select('users.id', 'users.avatar', DB::raw('COUNT(*) AS total'))
         ->where('friend_id', Auth::user()->id)
         ->where('status',0)
         ->groupBy('users.id')
         ->get();

在第一個站點上,這似乎違反了GROUP BY的規則,該規則指出無法選擇非聚合列。 但這是允許的,因為用戶id功能上確定了其他列的值。 換句話說,如果我們選擇一個用戶id ,我們將確切知道他的化身值必須是多少。

如果上述方法給您帶來錯誤,則可以嘗試使用GROUP BY

->groupBy('users.id', 'users.avatar')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM