2014-10-07 80 views
1

從本質上講,我有一個表是這樣的:計數並連接MySQL的條目

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
  • Jim Smith | 3 | B,A,C
  • Joseph Miller | 1 | A
  • Jim Smith | 3 | B,A,C
  • Jim Smith | 3 | B,A,C
  • Mark Jones | 2 | A,C

我花了時間,試圖創建一個基於關初始一個新表,增加這些領域,以及在看group_concatarray_count_valuesCOUNTDISTINCT,與其他環/陣列選項一起,並不能解決這個問題。

我發現了很多答案,計數和連接,但這裏的問題是我需要顯示每個行總計數/連接每個,而不是縮短它。

+0

請張貼一些代碼,以你迄今爲止嘗試過的例子。 – Scopey 2014-10-07 01:08:28

回答

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

這很好。我做了一些細微的修改:'$ query =「 SELECT彙總。* 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聚合 ON CONCAT('TABLE 1'。'COL 5' ,'','TABLE 1'。'COL 6')= aggregated.Name「;' – 2014-10-08 00:40:05

+0

正如你所看到的,我在SELECT中添加了一些字段。我想知道是否有一種方法可以修改,以便仍然顯示Profit和Image的唯一條目。 – 2014-10-08 00:42:48

+1

當然,但你必須從'TABLE 1'中選擇它們,而不是從'aggregated'中選擇它們。所以查詢變成了'SELECT aggregated。*,'TABLE 1'。'COL 17'AS Image,...'等等。 – 2014-10-08 00:48:07

1

沒有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'