Как отредактировать этот MySQL, чтобы объединить строки одного идентификатора в 1 вместо 3?

Следующий запрос mySQL получает данные из 2 таблиц, alerts_data а также alerts_list, Первая таблица содержит данные оповещения, а вторая содержит описание оповещения. Так что в alerts_data Есть несколько строк с одинаковым модулем alerts_data_id, который совпадает с alerts_list,

Чего я хочу добиться, так это отобразить что-то вроде этого

alert number 51, 5 clicked , 2 closed
alert number 57, 13 clicked, 3 closed, 8 waiting

используя MySQL или PHP (я не знаю, смогу ли я получить это через обычный MySQL)

Итак, пока я знаю, что не могу отобразить данные оповещения 51 в одну строку, но из-за различий alerts_data_status Я должен показать 3 строки для каждого.

Как я могу сделать это, как указано выше?

SELECT COUNT( alerts_data_id ) AS total, alerts_data_id, alerts_data_status, alerts_list.alerts_title
FROM  alerts_data
JOIN alerts_list ON
alerts_data.alerts_data_id = alerts_list.alerts_id
GROUP BY alerts_data_id, alerts_data_status

//выход

total - alerts_data_id - alerts_data_status - alerts_title
5     -     51 - clicked - alert number 51
2     -     52 - closed - alert number 51
13    -     57 - clicked - alert number 57
3     -     57 - waiting - alert number 57
8     -     57 waiting - alert number 57

Замечания: номер оповещения — это только примеры, это может быть любое число

// alert_data

id - alerts_data_id - alerts_data_status

// alerts_list

alerts_id - alerts_name - alerts_text

Вот sqlfiddle: http://sqlfiddle.com/#!9/c70c2/1

2

Решение

Это может быть заявка на GROUP_CONCAT().

Сначала вы хотите получить сводку своих предупреждений по alerts_data_id и alerts_data_status. Это немного сложно, потому что ваш sqlfiddle имеет целую кучу пустых alerts_data_status строки. Здесь я заменяю эти пустые строки на `? ‘. (http://sqlfiddle.com/#!9/c70c2/23/0)

                      SELECT COUNT(*) AS alerts_count,
alerts_data_id,
CASE WHEN LENGTH(alerts_data_status) = 0 THEN '?'
ELSE alerts_data_status END  AS alerts_data_status
FROM alerts_data
GROUP BY alerts_data_id, alerts_data_status

Затем вы хотите свернуть это внутри другого запроса

SELECT SUM(a.alerts_count) total,
a.alerts_data_id, b. alerts_name,
GROUP_CONCAT( CONCAT(a.alerts_count, ': ', a.alerts_data_status)
ORDER BY a.alerts_data_status
SEPARATOR "; " ) detail
FROM (
SELECT COUNT(*) AS alerts_count,
alerts_data_id,
CASE WHEN LENGTH(alerts_data_status) = 0 THEN '?'
ELSE alerts_data_status END  AS alerts_data_status
FROM alerts_data
GROUP BY alerts_data_id, alerts_data_status
) a
JOIN alerts_list b ON a.alerts_data_id = b.alerts_id
GROUP BY a.alerts_data_id, b.alerts_name

Это даст вам одну строку для каждого отдельного alert_data_id. Каждое предупреждение идентифицируется по количеству, его идентификатору и имени. (http://sqlfiddle.com/#!9/c70c2/26/0)

Затем строка будет содержать разделенный точкой с запятой список значений различного состояния оповещения.

1

Другие решения

Если я вас хорошо понимаю, думаю, вот что вам нужно;

SELECT
COUNT( alerts_data.id ) AS total,
ad.id,
(SELECT count(*) from alert_list al where al.alerts_id=ad.id and alerts_data_status='clicked') as clicked,
(SELECT count(*) from alert_list al where al.alerts_id=ad.id and alerts_data_status='closed') as closed,
(SELECT count(*) from alert_list al where al.alerts_id=ad.id and alerts_data_status='waiting') as waiting,
FROM  alerts_data ad
GROUP BY ad.id
0

Проверял другие ответы и ваш SQLFIDDLE и думал, что это может быть более хороший подход:

SELECT alerts_list.alerts_title,
SUM(CASE WHEN alerts_data_status = 'clicked' THEN 1 ELSE 0 END) AS clicked,
SUM(CASE WHEN alerts_data_status = 'closed' THEN 1 ELSE 0 END) AS closed,
SUM(CASE WHEN alerts_data_status = 'waiting' THEN 1 ELSE 0 END) AS waiting
FROM alerts_data
JOIN alerts_list ON alerts_data.alerts_data_id = alerts_list.alerts_id
GROUP BY alerts_list.alerts_title
0