#mysql #sqlfiddle
#mysql #sqlfiddle
Вопрос:
У меня проблема с запросами mysql, на самом деле, мне нужно создать веб-страницу с диаграммами, и мне нужно извлечь данные из базы данных следующим образом:
1- Получить общее количество данных, полученных за месяц, для каждого центра (это означает страну) за текущий год,
2- Получить общее количество данных, которые НЕ были выполнены за месяц, по центру за текущий год,
3- Получить общее количество данных, которые не были выполнены, И дату, превышающую 20 дней в месяц, для каждого центра за текущий год.
Итак, в целом, я могу извлекать данные для всех запросов thoses, с этим проблем нет. Проблема, с которой я сталкиваюсь, заключается в том, что мне нужны эти запросы, встроенные в 1 отдельный запрос, возвращающий мне такую таблицу:
| monthname | total | totalNotDone | totalExceed20Days |
| January | 52 | 3 | 1 |
| February | 48 | 4 | 0 |
| March | 54 | 1 | 3 |
и т.д.
Вот sqlfiddle, показывающий проблему :
отредактировано : http://sqlfiddle.com /#!2/8cc9c/1
Любая помощь была бы очень признательна, ребята, я действительно застрял.
Комментарии:
1. В этой скрипке довольно много нерелевантной информации, не так ли? Избавьтесь от него, а затем вернитесь к нам.
2. Пожалуйста, разместите соответствующую информацию здесь. Покажите схему для таблиц, некоторые примеры входных данных и запрос, который вы пробовали.
3. Как указал @Barmar, лучше всего указать соответствующую информацию в вопросе.
4. вот sqlfiddle sqlfiddle.com /#!2/8cc9c/1
Ответ №1:
Ваши основные запросы в порядке. Что вам нужно сделать, это обработать каждый из них как виртуальную таблицу, и LEFT JOIN
их вместе. Затем ваш верхний SELECT
уровень может выбрать соответствующие значения для вашей общей таблицы.
SELECT afftotal.date,
afftotal.centre_id,
afftotal.total AS total,
af20.total AS total_20,
afempty.total AS total_empty
FROM (
/* select total of affaires per month and per centre for this year */
select month(aff_date) AS `date`,
centre_id,
count(*) AS `total`
from affaires
where year(aff_date) = 2014
group by month(aff_date), centre_id
) AS afftotal
LEFT JOIN (
/* select total of affaires per month and per centre for this year where the affaire has been done
before 20 days. */
select month(`affaires`.`aff_date`) AS `date`,
centre_id,
count(*) AS `total`
from `affaires`
where year(`affaires`.`aff_date`) = 2014
and DATEDIFF(`affaires`.`aff_date`, `affaires`.`date_creation_pdl`) > 20
group by monthname(`affaires`.`aff_date`), centre_id
) AS af20 ON afftotal.date = af20.date
AND afftotal.centre_id = af20.centre_id
LEFT JOIN (
/* select total of affaires where the date_creation_pdl is empty */
select month(affaires.aff_date) as `date`,
centre_id,
count(*) as total
from affaires
where date_creation_pdl is null
and year(affaires.aff_date) = 2014
group by monthname(affaires.aff_date)
) AS afempty ON afftotal.date = afempty.date
AND afftotal.centre_id = afempty.centre_id
ORDER BY afftotal.centre_id, afftotal.date
http://sqlfiddle.com /#!2/d563e/24/0
Обратите внимание, что это суммирование как по centre_id, так и по дате, поэтому вы можете получить все значения centre_id в одном запросе.
Обратите внимание также, что ORDER BY
предложение помещается в конец всего запроса.
У вас есть три подзапроса, три виртуальные таблицы, если хотите, каждая с тремя столбцами: date, centre_id и total . Вы LEFT JOIN
объединяете ON
два из этих столбцов.
Мне пришлось немного повозиться с вашими запросами, чтобы у них были похожие имена столбцов и форматы данных столбцов, поэтому LEFT JOIN
операции имеют регулярную структуру.
Комментарии:
1. очень простой, не знал такого типа вложенности, очень хороший трюк 🙂