Объединение SELECT и таблицы

186
12 апреля 2018, 13:59

Есть две таблицы: задачи и кол-во часов для каждой из задач в конкретную дату:

task (id_task, id_user, id_object) 
task_hours (id_task, date, hours)

Выборкой получаю подсчет часов для каждой из задач в промежуток времени:

SELECT  task_hours.id_task AS taskId, SUM(task_hours.hours) AS summ 
FROM task_hours 
WHERE task_hours.date >=1519851600 AND   task_hours.date < 1522443600
GROUP BY task_hours.id_task

Каким образом можно объединить получившийся запрос с таблицей task, чтобы результат выглядел как:

id_task, id_user, id_object, summ
Answer 1

То что ты хочешь сделать называется подзапрос (а точнее derived tables, не помню русский термин), для начала вариант с оным:

SELECT  th.taskId, t.id_user, t.id_object, th.summ 
(   SELECT  task_hours.id_task AS taskId, SUM(task_hours.hours) AS summ 
    FROM task_hours 
    WHERE task_hours.date >=1519851600 AND   task_hours.date < 1522443600
    GROUP BY task_hours.id_task ) AS th
JOIN task AS t ON th.id_task == t.id_task

Но использовать его совсем не обязательно: mysql допускает присутствие обычных столбцов в GROUP BY-запросах, а так как ты группируешь по первичному ключу таблицы task(я надеюсь), то значения всех таких столбцов будут однозначны, а запрос упрощается до:

SELECT  th.id_task AS taskId, t.id_user, t.id_object, SUM(th.hours) AS summ 
FROM task_hours AS th JOIN task AS t ON th.id_task == t.id_task
WHERE th.date >=1519851600 AND  th.date < 1522443600
GROUP BY th.id_task

Если есть вопрос, что из этого более производительно, то почти наверняка (математический термин) оптимизатор запросов выстроит их планы одинаково, так что производительностью они отличаться не будут, но предпочтительна всё же вторая форма — она требует от оптимизатора быть чуточку менее умным.

READ ALSO
Массив разных типов

Массив разных типов

Как можно через шаблоны создать массив из разных типов(double, char, int и тд)?

267
Нужно сравнить изображения

Нужно сравнить изображения

Нужно сравнить два изображения (jpg), чуть позже, возможно, ещё и видео

213
Найти слово из файла, в котором встретится больше всего букв из слова, введённого с клавиатуры

Найти слово из файла, в котором встретится больше всего букв из слова, введённого с клавиатуры

Имеется файл, в нём написаны словаС клавиатуры вводится слово с неповторяющимися буквами

286