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

如何获得一列中与另一列中的项目相匹配的项目计数?

  •  3
  • mmattax  · 技术社区  · 16 年前

    假设我有两个数据表和一个链接表:

    A         B         A_B_Link          
    -----     -----     -----
    ID        ID        A_ID
    Name      Name      B_ID
    
    

    1. 我想写一个查询,这样我就有了a的所有列以及有多少个B链接到a,什么是最好的方法?

    2. 有没有办法让查询返回一行,其中包含来自的所有列,以及包含 全部的 B中的链接名称(可能用分隔符分隔?)

    注意 该查询必须从查询返回不同的行 ,所以简单的左-外连接在这里不起作用…我猜我需要嵌套的select语句?

    3 回复  |  直到 16 年前
        1
  •  3
  •   Ray Booysen    16 年前

    对于#1

    SELECT A.*, 
    (SELECT COUNT(*) FROM A_B_Link WHERE A_B_Link.A_ID = AOuter.A_ID)
    FROM A as AOuter
    
        2
  •  3
  •   Community CDub    7 年前

    关于你的第一个问题:

    SELECT A.ID, A.Name, COUNT(ab.B_ID) AS bcount
    FROM A LEFT JOIN A_B_Link ab ON (ab.A_ID = A.ID)
    GROUP BY A.ID, A.Name;
    

    这将输出A的每行一行,以及匹配B的计数。请注意,必须列出GROUPBY语句中A的所有列;这里没有办法使用通配符。

    另一种解决方案是使用相关子查询,如@Ray Booysen所示:

    SELECT A.*, 
      (SELECT COUNT(*) FROM A_B_Link 
       WHERE A_B_Link.A_ID = A.A_ID) AS bcount
    FROM A;
    

    这是可行的,但相关子查询的性能不是很好。

    对于第二个问题,您需要类似MySQL的东西 GROUP_CONCAT() 聚合函数。在MySQL中,您可以得到一个逗号分隔的 B.Name 每行一个类似于这样的:

    SELECT A.*, GROUP_CONCAT(B.Name) AS bname_list
    FROM A 
      LEFT OUTER JOIN A_B_Link ab ON (A.ID = ab.A_ID)
      LEFT OUTER JOIN B ON (ab.B_ID = B.ID)
    GROUP BY A.ID;
    

    在Microsoft SQL Server中没有简单的等价物。检查此处,了解关于此的其他问题: " Simulating group_concat MySQL function in MS SQL Server 2005? "

    或者谷歌搜索' microsoft SQL server "group_concat" “用于各种其他解决方案。

        3
  •  2
  •   Joel Coehoorn    16 年前
    SELECT A.*, COUNT(B_ID)
    FROM A
    LEFT JOIN A_B_Link ab ON ab.A_ID=A.ID