计算并连接MySQL条目

时间:2014-10-07 01:07:25

标签: php mysql sql count group-concat

基本上,我有一个像这样的表:

FirstName, LastName, Type
Mark, Jones, A
Jim, Smith, B
Joseph, Miller, A
Jim, Smith, A
Jim, Smith, C
Mark, Jones, C

我需要做的是能够以PHP / HTML显示这些内容,例如:

Name | Total Count Per Name | All Type(s) Per Name

看起来像......

  • 马克琼斯| 2 | A,C
  • 吉姆史密斯| 3 | B,A,C
  • 约瑟夫米勒| 1 | A
  • 吉姆史密斯| 3 | B,A,C
  • 吉姆史密斯| 3 | B,A,C
  • 马克琼斯| 2 | A,C

我花时间尝试根据初始表创建新表,添加这些字段,以及查看group_concatarray_count_valuesCOUNT和{{1与其他循环/数组选项一起,并且无法解决这个问题。

我发现了许多可以计算和连接的答案,但问题是我需要显示每行的总计数/连接数,而不是缩短它。

2 个答案:

答案 0 :(得分:2)

这样做怎么样?

SELECT aggregated.* FROM table_name t
LEFT JOIN (
    SELECT
        CONCAT(FirstName, ' ', LastName) AS Name,
        COUNT(Type) AS `Total Count Per Name`,
        GROUP_CONCAT(Type SEPARATOR ',') AS `All Type(s) Per Name`
    FROM table_name
    GROUP BY Name) AS aggregated
ON CONCAT(t.FirstName, ' ', t.LastName) = aggregated.Name

答案 1 :(得分:1)

如果没有ORDER BY子句,则返回行的顺序是不确定的。没错,根据我个人的偏好,结果是可重复的。

我们可以使用"内联视图" (MySQL将其称为派生表)以获取(FirstName,LastName)的Type值的计数和串联。

然后执行连接操作以将内联视图中的行与详细信息表中的每一行进行匹配。

SELECT CONCAT(d.FirstName,' ',d.LastName) AS name
     , c.total_coount_per_name
     , c.all_types_per_name
  FROM mytable d
  JOIN ( SELECT b.FirstName
              , b.LastName
              , GROUP_CONCAT(DISTINCT b.Type ORDER BY b.Type) AS all_types_per_name
              , COUNT(*) AS total_count_per_name
           FROM mytable b
          GROUP 
             BY b.FirstName
              , b.LastName
       ) c
    ON c.FirstName = d.FirstName
   AND c.Last_name = d.LastName
 ORDER BY d.FirstName, d.LastName

如果您有id列或其他"序列"列,您可以使用它来指定要返回行的顺序; GROUP_CONCAT函数中的相同内容。如果要重复值,可以省略GROUP_CONCAT中的DISTINCT关键字... 'B,A,B,B,C'