使现代化
:另一个等效的mysql查询是
SELECT
c.*,
SUM(pc.projects_count) as projects_count,
COUNT(p.id) as unique_projects_count,
SUM(p.cost) as projects_cost,
SUM(p.area) as projects_area
FROM companies c
INNER JOIN (
SELECT company_id, project_id, COUNT(1) AS projects_count
FROM project_associate_company
WHERE deleted_at IS NULL
GROUP BY company_id, project_id
) pc ON c.id = pc.company_id
INNER JOIN projects p ON pc.project_id = p.id
WHERE p.deleted_at IS NULL
GROUP BY c.id;
:您在mysql中寻找的等效查询是
SELECT
id,
`name`,
state,
`type`,
SUM(projects_count) projects_count,
SUM(unique_projects_count) AS unique_projects_count,
SUM(projects_cost) AS projects_cost,
SUM(projects_area) AS projects_area
FROM (
SELECT
c.*,
COUNT(p.id) as projects_count,
COUNT(DISTINCT p.id) as unique_projects_count,
p.cost as projects_cost,
p.area as projects_area
FROM companies c
INNER JOIN project_associate_company pc ON c.id = pc.company_id
INNER JOIN projects p ON pc.project_id = p.id
WHERE pc.deleted_at IS NULL AND p.deleted_at IS NULL
GROUP BY c.id, p.id
) AS tmp
GROUP BY tmp.id
$innerQuery = DB::table('companies as c')
->join('project_associate_company as pc', 'c.id', '=', 'pc.company_id')
->join('projects as p', 'pc.project_id', '=', 'p.id')
->select(DB::raw("c.id,
c.name,
c.state,
c.type,
COUNT(p.id) as projects_count,
COUNT(DISTINCT p.id) as unique_projects_count,
p.cost as projects_cost,
p.area as projects_area"))
->whereNull('pc.deleted_at')
->whereNull('p.deleted_at')
->groupByRaw('c.id, p.id');
$query = DB::query()->fromSub($innerQuery, 't')
->select(DB::raw("
id,
`name`,
state,
`type`,
SUM(projects_count) projects_count,
SUM(unique_projects_count) AS unique_projects_count,
SUM(projects_cost) AS projects_cost,
SUM(projects_area) AS projects_area
"))
->groupBy('t.id')
->paginate()->toArray();