necrodeflorator, GROUP BY e.id достаточно, просто внести его в список выборки, емнип группировка сразу по 2 полям будет сильно медленнее, кроме того нет уверенности что имена уникальны.
ThunderCat, с чего это группировка по двум полям будет медленнее в данном случае? Если id не отличаются, то имена тоже будут одинаковые.
Без добавления имени в список группировки вы не сможете указать это имя в блоке SELECT. Вам придётся делать подзапрос для извлечения имени:
SELECT
(SELECT ee.name FROM employee ee WHERE ee.id = e.id) AS name, SUM(t.hours)
FROM
employees e
JOIN time_reports t ON t.employee_id = e.id
GROUP BY e.id
ORDER BY 2
LIMIT 3
кроме того нет уверенности что имена уникальны
Для моего запроса и не требуется уникальности. Просто будут тёзки в отдельных строках с разными суммами.
Если id не отличаются, то имена тоже будут одинаковые.
Хм, нифига подобного. Имена вполне себе могут быть повторяющимися и по ним тоже будет группировка. Есть смысл делать группировку по уникальному числовому полю, а не по тексту.
ThunderCat, вы меня явно не поняли. Я всего лишь имел в виду, что группу в данной группировке целиком и полностью определяет идентификатор. Он уникальный в каждой строке. Не может быть двух строк с одним и тем же идентификатором, а значит не может быть двух разных имён под одним идентификатором.
Это значит, что нет разницы группировать только по идентификатору, или по идентификатору + имени.
То есть, если мы добавим имя в критерии группировки вторым полем, то ничего не изменится, лишь можно будет указать это имя в блоке SELECT. Иначе было бы нельзя.
Сергей Паньков, есть эти таблицы, каждый день туда заносится рабочими количество часов. нужно вывести в определённый день 3 сотрудника (вместе с именами) у которых в сумме больше всего часов.
Примерно так:
| Monday | John (4.45 hours), Jane (7.54 hours), Alex (3.5 hours) |
Night_Harpy, перечитайте. У вас вопросов не возникает к своему тексту?
каждый день туда заносится рабочими количество часов
нужно вывести в определённый день
| Monday |
ЧТО ВЫ НАЗЫВАЕТЕ ДНЁМ?! День недели?
Нужно суммировать все понедельники?
Если речь об одном конкретном календарном дне, то какого черта такой пример дурацкий? Лень было дату написать нормально?
John (4.45 hours), Jane (7.54 hours), Alex (3.5 hours)
Что это за запятые? Вам именно так отформатировать надо? То есть в результате нужна таблица, у которой ОДНА строка и ДВА столбца, где в первом день недели, а во втором через запятую имена с суммами часов в скобках? А у вас в таблице только даты (без времени) Может быть несколько записей для одного человека за один день?
Одни, блин, вопросы, а вам лень подробно и детально сформулировать задачу.
"Вот чё-то примерно такое мне надо, догадайтесь там сами или напишите мне разных решений а я, лентяй, выберу"
Сергей Паньков, прошу прощения
вы в целом всё правильно поняли
суммировать только один календарный день; выводится должно именно как день недели через запятую, как таблица и с суммами часов в скобках. Для одного человека одна запись в день
Сергей Паньков, просто вывести надо всё как вы сказали, как таблица, через запятую, день названием и 3 сотрудника с самыми большими часами указанными в столбце hours
Night_Harpy, ваши комментарии не соответствуют формулировке вопроса. Кроме того, этот ресурс не предназначен для публикации заданий. Это задание, поскольку вы самостоятельно не потрудились не только его попробовать решить, но и хотя бы правильно понять и сформулировать.
necrodeflorator, а когда и где это можно было юзать неагрегированные поля, отсутствующие в списке группировки? Как вы себе это представляете? Какое из значений там будет фигурировать?
SELECT employees.name, SUM(time_reports.hours) as hours
FROM time_reports
LEFT JOIN employees ON time_reports.employee_id = employees.id
GROUP BY time_reports.employee_id
ORDER BY hours DESC
LIMIT 3