mysql group by并从右连接表中获取特定记录

时间:2014-11-18 08:32:02

标签: mysql join

我的数据库包含以下数据结构和样本数据。每家公司都有多个成员。该关系位于company_member表中。请注意我在下面给出的必填字段。

公司

id   title
1    company-1
2    company-2

company_member

companyid  memberid
1          1
1          2
1          3
2          4
2          5
2          6

构件

id   firstname  member_type_id
1    Name-1     2
2    Name-2     3
3    Name-3     3
4    Name-4     3
5    Name-5     2
6    Name-6     1

MEMBER_TYPE

id   user_level
1    0
2    1
3    2

我想要唯一公司列表,每个公司都有一名成员。但该成员应该是公司内最低 user_level 。即,应该得到以下结果;

结果

companyid  company_title  memberid  member_name  user_level
1          company-1      1         Name-1       1
2          company-2      6         Name-6       0

我想知道如何在同一家公司中找到一个用户级别最低的成员。

2 个答案:

答案 0 :(得分:1)

这有点复杂,但这是使用not exists执行此操作的一种方法,对于更大的表,使用not exits是明智的,因为使用数据透视表它不会使用索引。

select
c.id,
c.title,
m.id as member_id,
m.firstname,
mt.user_level
from company_member_map cmp
join company c on c.id = cmp.companyid
join member m on m.id = cmp.memberid
join member_type mt on mt.id = m.member_type_id
where not exists
(
  select 1 from company_member_map t1 
  join member t2 on t2.id = t1.memberid
  join member_type t3 on t3.id = t2.member_type_id
  where
  t1.companyid = cmp.companyid
  and t3.user_level < mt.user_level
)

<强> DEMO

答案 1 :(得分:0)

最后我找到了解决方案:

select c.id companyid, c.title company_title, m.firstname member_name, mt.user_level
from company c
inner join company_member cm on cm.companyid = c.id
inner join member m on m.id = cm.memberid
inner join member_type mt on mt.id = m.member_type_id
inner join 
    (select c1.id companyid, mt1.user_level
        from company c1
        join company_member cm1 on cm1.companyid = c1.id
        join member m1 on m1.id = cm1.memberid
        join member_type mt1 on mt1.id = m1.member_type_id
        group by c1.id,m1.id
        order by user_level asc
    ) sq on c.id = sq.companyid and sq.user_level = mt.user_level
group by c.id;

如果有人有更好的解决方案或简化的解决方案,请纠正此问题。

<强> Check this SQL Fiddle