2017-06-18 25 views
0

我的問題很簡單。我有兩個表爲mysql中的列計數行

transaction_bodies 
------------------ 
body_id 
full_name 

,另一種是

transaction_accounts 
-------------------- 
account_id 
body_id 
account_name 

關係one to many。一個機構可以有多個帳戶。我正在嘗試創建一個查詢來統計機構擁有的帳戶。

我想這

SELECT * 
    FROM 
    (
     SELECT count(*) as trans, tb.full_name 
     FROM transaction_accounts ta 
     LEFT JOIN transaction_bodies tb 
     ON tb.body_id = ta.body_id 
    ) as row; 

但是,這並沒有給正確的結果。任何人都可以幫我解決這個問題嗎? 如果可以提供如何在Laravel中編寫子查詢,這將是一個非常讚賞的。

+1

你您使用的佞(Laravel機型)與Laravel標記此,? –

回答

1

試試這個:

$result = DB::table('transaction_bodies') 
     ->leftJoin('transaction_accounts as 
           ta','transaction_bodies.body_id','ta.body_id') 
      ->select(DB::raw('count(ta.account_id) AS trans'),'transaction_bodies.full_name') 
      ->groupBy('transaction_bodies.body_id') 

     ->get(); 
1

你可以用LEFT JOIN做到這一點,如:

SELECT tb.body_id, COUNT(ta.*) 
FROM transaction_bodies LEFT JOIN transaction_accounts ta 
ON tb.body_id = ta.body_id 
GROUP BY tb.body_id; 
1

用一個簡單的LEFT JOIN就可以實現像

SELECT tb.full_name, COUNT(account_id) as accounts 
FROM transaction_bodies tb LEFT JOIN transaction_accounts ta 
ON tb.body_id = ta.body_id 
GROUP BY tb.body_id; 

在Laravel你可以用模型做到像

$accounts = Transaction_body::leftJoin('transaction_accounts as ta','transaction_bodies.body_id','ta.body_id')->groupBy('transaction_bodies.body_id')->get(); 

無模特

$accounts = DB::table('transaction_bodies')->leftJoin('transaction_accounts as ta','transaction_bodies.body_id','ta.body_id')->groupBy('transaction_bodies.body_id')->get(); 
1
  /** 
      * Class Body 
      */ 
      class Body extends Model 
      { 
       /** 
       * The database table used by the model. 
       * 
       * @var string 
       */ 
       protected $table = 'transaction_bodies'; 

       /** 
       * Get the accounts for the Transaction Body. 
       */ 
       public function accounts() 
       { 
        return $this->hasMany(Account::class); 
       } 
      } 

      /** 
      * Class Account 
      */ 
      class Account extends Model 
      { 
       /** 
       * The database table used by the model. 
       * 
       * @var string 
       */ 
       protected $table = 'transaction_accounts'; 

       /** 
       * Get the body that owns the account. 
       */ 
       public function body() 
       { 
        return $this->belongsTo(Body::class); 
       } 
      } 

      //usage 
      $accounts = Body::find(1)->accounts; 

https://laravel.com/docs/5.4/eloquent-relationships#one-to-many