从两个表中以指定格式获取数据

时间:2018-06-22 11:04:25

标签: mysql database

我在数据库方面不是很专业,因此正在寻求解决以下问题的有效方法。如已解决的问题,但使用了许多联合查询和子查询,但这些查询似乎并不理想。

INSERT INTO teacher(id, name) VALUES(1, 'Mike');
INSERT INTO teacher(id, name) VALUES(2, 'Jim');
INSERT INTO teacher(id, name) VALUES(3, 'Chris');
INSERT INTO teacher(id, name) VALUES(4, 'John');
*************************************************************
INSERT INTO subject(id, name, teacherId) VALUES(1, 'DSA', 1);
INSERT INTO subject(id, name, teacherId) VALUES(2, 'OPPS', 2);
INSERT INTO subject(id, name, teacherId) VALUES(3, 'JAVA', 2);

我的预期输出是; 迈克1 吉姆2 克里斯0 约翰0

说明: 1.每个老师的名字以及相关的科目。 2.与每位老师相关的科目编号,即0、1,2等 3.未分配任何学科的教师姓名。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

以下查询将为您提供帮助

select t.name, count(s.name) from teacher t
left join subject s on s.teacherId = t.id
group by t.name;

您需要同时加入教师ID的两个表 然后计算主题名称。

LEFT JOIN用于即使在teacher表中没有数据,也可以从subject表中获取数据

GROUP BY用于汇总每个老师的subject name

答案 1 :(得分:0)

这是不使用任何联接即可执行此操作的有效方法。我曾经以这种方式进行查询以避免LEFT JOIN。

SELECT
  `name`,
  (SELECT COUNT(id)
   FROM `subject`
   WHERE subject.teacherId = teacher.id)    'count'
FROM teacher;

答案 2 :(得分:0)

您可以使用全部合并

public function getEntitiesWithKeyneeds()
{
    $valuechains = Valuechain::orderBy('valuechains.id')
        ->join('lang_valuechain', 'valuechains.id', '=', 'lang_valuechain.valuechain_id')
        ->join('langs', 'lang_valuechain.lang_id', '=', 'langs.id')
        ->where('langs.isMainlanguage', '=', '1')
        ->with('segments')
        ->with('keyneeds')
        ->withCount('segments')
        ->withCount('keyneeds')
        ->get();


    foreach ($valuechains as $valuechain) {
        $ids[] = $valuechain->id;
    }

    foreach ($ids as $id) {
        $vcskns[] = Segment::select(
            'lang_valuechain.vcname', 'lang_valuechain.vcshortname',
            'lang_segment.segname', 'lang_segment.segshortname', 'segments.id',
            'lang_segment.created_at', 'lang_segment.updated_at', 'lang_segment.deleted_at'
        )
            ->distinct()
            ->withCount('keyneeds')
            ->join('lang_segment', 'segments.id', '=', 'lang_segment.segment_id')
            ->join('valuechains', 'segments.valuechain_id', '=', 'valuechains.id')
            ->join('lang_valuechain', 'valuechains.id', '=', 'lang_valuechain.valuechain_id')
            ->join('sectors', 'valuechains.sector_id', '=', 'sectors.id')
            ->join('lang_sector', 'sectors.id', '=', 'lang_sector.sector_id')
            ->join('langs', 'lang_valuechain.lang_id', '=', 'langs.id')
            ->where([
                ['langs.isMainlanguage', '=', '1'],
                ['valuechains.id', '=', $id]
            ])
            ->whereNull('valuechains.deleted_at')
            ->whereNull('sectors.deleted_at')
            ->whereNull('segments.deleted_at')
            ->get();

    }
    return $vcskns;
}