所以我有两个表,组织和联系人。两个表都有“电子邮件”列,我需要做的是保留组织名称,但在电子邮件列中连接所有电子邮件(组织的+所有联系人电子邮件)。
以下是一些我没试过的版本
1)这个没有分组:
$customers = DB::table('customers')
->whereRaw('LENGTH(customers.email) > 4')
->select([
'customers.id',
'customers.name',
'customers.email'
]);
$contacts = DB::table('contacts')
->whereRaw('LENGTH(contacts.email) > 4')
->leftJoin('customers', 'contacts.customer_id', '=', 'customers.id')
->select([
'customers.id',
'customers.name',
'contacts.email'
]);
return $customers
->union($contacts)
->select([
'id',
'name',
DB::raw('GROUP_CONCAT(DISTINCT email, ", ") AS emails'),
])
->groupBy('id')
->get();
2)这个实际上非常接近,但它不会过滤掉联系人或客户都没有DB::raw('LENGTH(email) > 4')
return $customers = DB::table('customers')
->leftJoin('contacts', 'contacts.customer_id', '=', 'customers.id')
->select([
'customers.id',
'customers.name',
'registration',
DB::raw('GROUP_CONCAT(DISTINCT contacts.email, ", ") AS contact_emails'),
'customers.email'
])
->groupBy('customers.id')
->get();
3)我试图接近子查询(我知道它只会过滤掉没有电子邮件的联系人)
3.1)尝试子查询1会导致错误:JoinClause::whereRaw()
不存在
return $customers = DB::table('customers')
->leftJoin('contacts', function($join) {
$join->on('contacts.customer_id', '=', 'customers.id')
->whereRaw('LENGTH(email) > 4');
})...
3.2)这个产生下面的语法错误:
return $customers = DB::table('customers')
->leftJoin('contacts', function($join) {
$join->on('contacts.customer_id', '=', 'customers.id')
->where(DB::raw('LENGTH(email) > 4'));
})
Connection.php第333行中的1/2 PDOException:SQLSTATE [42000]:语法 错误或访问冲突:1064您的SQL语法有错误; 检查与您的MySQL服务器版本对应的手册 正确的语法使用附近'?第1行
Connection.php第713行中的customers
。id
'分组2/2 QueryException:SQLSTATE [42000]:语法 错误或访问冲突:1064您的SQL语法有错误; 检查与您的MySQL服务器版本对应的手册 正确的语法使用附近'?在第1行分组
customers
。id
'(SQL: 选择customers
。id
,customers
。name
,registration
, GROUP_CONCAT(DISTINCT contacts.email,“,”)AS contact_emails, 来自customers
的{{1}}。customers
contacts
。contacts
=customer_id
。customers
和LENGTH(contacts.email) 4个分组id
。customers
)
3.3)一些例子说我应该这样做,但这会产生错误id
Not enough arguments for the on clause.