代码之家  ›  专栏  ›  技术社区  ›  user3541631

如果有3个实体,则根据其他2个实体的关系数(计数)得到第三个实体

  •  0
  • user3541631  · 技术社区  · 5 年前

    我有3个实体,类型,项目,所有者

    id name
    1   owner1
    2   owner2
    3   owner3
    

    一个所有者可以有多个项目

    Item
    
    id   name  owner_id
    1   item1  1
    2   item2  1
    3   item3  1 
    4   item4  3
    5   item5  2
    
    Type 
    
    id name
    1  alpha 
    2  beta
    

    项目和类型之间存在多对多关系。一个项目可以有多个类型,一个类型可以有多个项目

    Item_Type
    
    id item_id type_id
    
    1   1       1
    2   1       2 
    3   3       1
    4   4       1
    

    通过名称指定一个类型,我需要获得所有拥有该类型项的所有者,按每种类型项的数量排序。

    因此,我从以下几点开始:

    SELECT Type.name, Item_Type.item_id from Type WHERE Type.name = 'my_var' INNER JOIN Item_Type ON Type.id = Item_Type.type_id
    

    因此,我需要对每种类型的项目进行计数,然后根据计数对所有者进行排序。

    我不知道如何通过计数来处理这个订单。

    预期-示例:

    因此,如果为类型I选择 name :“alpha”对应于 id 1

    这个 item_id Type 具有 id 1 是: 1,3,4

    1,3 符合的 owner_id 是1(计数=2)。 id为的项目 4 符合的 所有者id 是3(计数=1)。

    因此,结果(按顺序)将是 owner1, owner3

    2 回复  |  直到 5 年前
        1
  •  1
  •   Fahmi    5 年前

    你可以在下面试试-

    DEMO

    select d.name as ownername,count(distinct c.name) as itemcount from 
    Item_Type a 
    inner join Types b on a.type_id=b.id
    inner join Item c on a.item_id=c.id
    inner join Owner d on c.owner_id=d.id
    group by d.name
    
        2
  •  1
  •   Nick    5 年前

    此查询将获取所需的结果。它查找每个所有者拥有的所有项目,然后按项目类型对其进行筛选,以仅包括类型为的项目 alpha COUNT 所有者拥有的项目数,并按该值降序排列结果:

    SELECT t.name, o.name, COUNT(i.id) AS num_type
    FROM Owner o
    JOIN Item i ON i.owner_id = o.id
    JOIN Item_Type it ON it.item_id = i.id
    JOIN Type t ON t.id = it.type_id
    WHERE t.name = 'alpha'
    GROUP BY t.name, o.name
    ORDER BY num_type DESC
    

    输出:

    name    name    num_type
    alpha   owner1  2
    alpha   owner3  1
    

    Demo on dbfiddle