вложенный запрос mysql с 4 запросами

#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. очень простой, не знал такого типа вложенности, очень хороший трюк 🙂