[英]Count and concatenate MySQL entries
基本上,我有一個像這樣的表:
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
和DISTINCT
,以及其他循環/數組選項,並且array_count_values
這個問題。
我發現了許多可以計算和連接的答案,但問題是我需要顯示每行的總計數/連接數,而不是縮短它。
這樣做怎么樣?
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
如果沒有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函數中的相同內容。 如果你想重復值'B,A,B,B,C'
你可以省略GROUP_CONCAT中的DISTINCT關鍵字...... 'B,A,B,B,C'
,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.