簡體   English   中英

計算並連接MySQL條目

[英]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

看起來像......

  • 馬克瓊斯| 2 | A,C
  • 吉姆史密斯| 3 | B,A,C
  • 約瑟夫米勒| 1 | 一種
  • 吉姆史密斯| 3 | B,A,C
  • 吉姆史密斯| 3 | B,A,C
  • 馬克瓊斯| 2 | A,C

我花了一些時間嘗試創建一個基於初始表的新表,添加這些字段,以及查看group_concatarray_count_valuesCOUNTDISTINCT ,以及其他循環/數組選項,並且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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM