计算和连接 MySQL 条目

Posted

技术标签:

【中文标题】计算和连接 MySQL 条目【英文标题】:Count and concatenate MySQL entries 【发布时间】:2014-12-01 08:32:41 【问题描述】:

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

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 |一个 吉姆·史密斯 | 3 | B、A、C 吉姆·史密斯 | 3 | B、A、C 马克·琼斯 | 2 | A、C

我花了一些时间尝试根据初始表创建一个新表,添加这些字段,以及查看group_concatarray_count_valuesCOUNTDISTINCT,以及其他循环/数组选项,无法弄清楚。

我找到了许多计数和连接的答案,但这里的问题是我需要显示每一行以及每个行的总计数/连接,而不是缩短它。

【问题讨论】:

请发布一些代码,并附上您迄今为止尝试过的示例。 【参考方案1】:

这样做怎么样?

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

【讨论】:

这很好用。经过一些细微的修改,我让它工作了:$query = " SELECT aggregated.* FROM 'TABLE 1' LEFT JOIN ( SELECT CONCAT('COL 5', ' ', 'COL 6') AS Name, COUNT('COL 20') AS 'Total Count Per Name', GROUP_CONCAT('COL 20' SEPARATOR ', ') AS 'All Type(s) Per Name', 'COL 17' AS Image, CONCAT('COL 7', ', ', 'COL 8') AS Location, 'COL 29' AS Profits FROM 'TABLE 1' GROUP BY Name) AS aggregated ON CONCAT('TABLE 1'.'COL 5', ' ', 'TABLE 1'.'COL 6') = aggregated.Name"; 如您所见,我在 SELECT 中添加了一些字段。我想知道是否有一种方法可以修改它以仍然显示利润和图像的唯一条目。 当然可以,但是您必须从 TABLE 1 中选择它们,而不是从 aggregated 中选择它们。所以查询变成了SELECT aggregated.*, 'TABLE 1'.'COL 17' AS Image, ...等等。 在主查询的开头。从aggregated 视图中删除它们。 aggregated 视图应该只包含我的示例中已经存在的列。 我明白了,我做到了SELECT 'TABLE 1'.'COL 17' AS Image, aggregated.* ...,它成功了。感谢您为我指明正确的方向和理解提供的所有帮助!【参考方案2】:

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

我们可以使用“内联视图”(mysql 将其称为派生表)来获取 (FirstName,LastName) 的类型值的计数和连接。

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

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',

【讨论】:

以上是关于计算和连接 MySQL 条目的主要内容,如果未能解决你的问题,请参考以下文章

在多对多连接表中,如何计算两个“所有者”共享的条目数?

java mysql - 如何快速执行许多复杂的计算?

将行值转换为列,并计算所有可能值 mysql 的重复次数

MySQL时间/日期计算

MySQL连接和连接行而不重复条目[重复]

计算 A 类和 B 类中的项目 (MySQL)