基本上,我有一个像这样的表:
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
看起来像......
我花时间尝试根据初始表创建新表,添加这些字段,以及查看group_concat
,array_count_values
,COUNT
和{{1与其他循环/数组选项一起,并且无法解决这个问题。
我发现了许多可以计算和连接的答案,但问题是我需要显示每行的总计数/连接数,而不是缩短它。
答案 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'
,