Я пишу запрос, который должен возвращать агрегированные часы для нескольких пользователей в день / месяц / год.
Таблица выглядит примерно так:
+------------------------------------------+
| id | entity_id | minutes | person | date |
+------------------------------------------+
Как должен выглядеть :
+----------------------------+
| year | month | day | hours |
| 2008 | 12 | 1 | 30 |
| 2008 | 12 | 2 | 40 |
| 2008 | 12 | 3 | 23 |
+----------------------------+
Вместо этого hours
часто намного больше из-за возвращаемых строк, вызванных left join
.
Проблема в том, что мне нужно запросить эту таблицу на основе тегов, которые связаны с соответствующими объектами. Когда я присоединяюсь к двум таблицам (tag_entity
, который предоставляет ссылку, и tags
, который предоставляет действительные имена тегов), мой SUM()
больше не работает, так как возвращается слишком много результатов.
Запрос:
select
date_format(from_unixtime(date), '%Y-%m-%d') as myDate,
ROUND(SUM(time) / 60,1) as hours
from time h
left join tag_entity te on te.entity_id = h.entity_id
left join tags t on t.tag_id = te.tag_id
where (t.tag_name NOT IN ('foo', 'bar', 'baz') OR t.tag_name IS NULL)
group by
myDate
order by
hours DESC, myDate ASC
Как я могу это исправить?
EDIT:
Вот схемы для tag
и tag_entity
:
Tag
+----------+-------------+
| Field | Type |
+----------+-------------+
| tag_id | int(11) |
| tag_name | varchar(50) |
+----------+-------------+
И tag_entity
:
+-----------+---------+
| Field | Type |
+-----------+---------+
| id | int(11) |
| tag_id | int(11) |
| entity_id | int(11) |
+-----------+---------+