Подсчет и объединение записей 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 | А, С
  • Джим Смит | 3 | B, A, C
  • Джозеф Миллер | 1 |
  • Джим Смит | 3 | B, A, C
  • Джим Смит | 3 | B, A, C
  • Марк Джонс | 2 | А, С

Я потратил время, пытаясь создать новую таблицу на основе исходной, добавив эти поля, а также глядя на group_concat, array_count_values, COUNT, а также DISTINCTнаряду с другими параметрами цикла / массива, и не может понять это.

Я нашел несколько ответов, которые подсчитываются и объединяются, но проблема здесь в том, что мне нужно отображать каждую строку с общим количеством / объединением для каждого, а не сокращать его.

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
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 столбец или какой-либо другой столбец «sequence», вы можете использовать его для указания порядка, в котором должны быть возвращены строки; то же самое в функции GROUP_CONCAT. Вы можете опустить ключевое слово DISTINCT из GROUP_CONCAT, если вы хотите повторные значения … 'B,A,B,B,C',

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector