Следующий запрос 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
Это может быть заявка на 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)
Затем строка будет содержать разделенный точкой с запятой список значений различного состояния оповещения.
Если я вас хорошо понимаю, думаю, вот что вам нужно;
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
Проверял другие ответы и ваш 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