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

在MySQL中查找同一表中一行的多个匹配项

  •  1
  • DevMan  · 技术社区  · 8 年前

    我的问题很简单,但我找不到任何解决办法。 请帮我个忙,因为我陷得很深。

    这是我的桌子。

    users_table:
    
     id | name | admin   | property_id
    -----------------------------------
     1  | x    | 1       | 0
     2  | y    | 1       | 0
     3  | z    | 0       | 1
     4  | t    | 0       | 2
     4  | u    | 0       | 2
     4  | o    | 0       | 2
    

    我有两个 records 哪些是 admin 还有一些其他的 记录 通过匹配 property_id id . 最后我想要的是 管理员 行数据和 count properties . 问题是数据都在同一个表中。 这就是所需查询的输出。

      id | name | admin   | property_count
    -----------------------------------
      1  | x    | 1       | 1
      2  | y    | 1       | 3
    

    我希望我能解释清楚。 事先谢谢。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Alex    8 年前

    http://sqlfiddle.com/#!9/5ad1fb/4

    SELECT u.*, COUNT(ut.id) property_count
    FROM users_table u
    LEFT JOIN users_table ut
    ON u.id = ut.property_id
    WHERE u.admin = 1
    GROUP BY u.id, u.name, u.admin
    
        2
  •  2
  •   Gordon Linoff    8 年前

    您似乎想要一个自连接和聚合:

    select t1a.id, t1a.name, t1a.admin, count(t1.id) as property_count
    from table1 t1a left join
         table1 t1
         on t1a.id = t1.property_id
    where t1a.admin = 1
    group by t1a.id, t1a.name, t1a.admin;
    

    顺便说一下,如果没有 join :

    select (case when admin = 1 then id else property_id end) as id,
           max(case when admin = 1 then name end) as name,
           max(admin) as admin,
           sum( admin <> 1 ) as property_count
    from table1 t1
    group by (case when admin = 1 then id else property_id end);