По сути, у меня есть таблица, которая выглядит так:
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
наряду с другими параметрами цикла / массива, и не может понять это.
Я нашел несколько ответов, которые подсчитываются и объединяются, но проблема здесь в том, что мне нужно отображать каждую строку с общим количеством / объединением для каждого, а не сокращать его.
Как насчет этого?
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).
Затем выполните операцию соединения, чтобы сопоставить строки из встроенного представления с каждой строкой в таблице сведений.
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'
,