#mysql #debugging #database-design
#mysql #отладка #база данных-дизайн
Вопрос:
Я пытаюсь создать запрос. Запрос является частью системы планирования работы и используется, чтобы узнать, сколько часов каждому пользователю системы выделено в день на все задания, за исключением того, которое просматривается в данный момент.
Я хочу, чтобы на выходе были псевдонимы с красивыми именами, такие как hours_mon, hours_tue и т.д.
В настоящее время запрос выглядит следующим образом:
SELECT SUM(alloc.hours), alloc.day
FROM grwp_allocations AS alloc
LEFT JOIN grwp_jobs AS job ON (job.id = alloc.job_id AND job.id != '3')
WHERE alloc.user_id = '35'
AND alloc.deleted = '0'
AND alloc.acknowledged = '0'
GROUP BY alloc.day
Который работает нормально, но я действительно хочу заменить ‘SUM (alloc.hours)’ на hours_ …
Я пробовал следующее, но оно выдает ошибку
SELECT SUM(alloc.hours) AS CONCAT('hours_',alloc.day), alloc.day
Схема таблицы: grwp_allocations:
- ID
- job_id
- user_id
- день
- часы
grwp_jobs:
- ID
Помните, я хочу, чтобы в конце были доступны следующие данные:
hours_mon, hours_tue, hours_wed и т.д. где ‘mon’, ‘tue’, ‘wed’ и т.д. Являются значениями из поля DAY, А значением псевдонима являются (суммированные) часы.
Спасибо.
Комментарии:
1. Я полагаю, вам нужна подготовленная инструкция.
2. Как бы помогла PS? Я запускаю запрос динамически для каждого пользователя в системе.
3. этот мат поможет вам dev.mysql.com/doc/refman/5.0/en /…
Ответ №1:
Это не имеет большого смысла.
Вам ЛИБО нужен hours_per_day
столбец, который будет генерировать данные типа:
hours_per_day | day
--------------- -------
10 | mon
9 | tue
это, очевидно, легко исправить, просто переименовав столбец SUM в вашем запросе:
SELECT SUM(alloc.hours) AS hours_per_day`
или
вам нужен столбец для каждого дня недели ( hours_mon
, hours_tue
…), для которого потребуется совершенно другой запрос — не просто разные имена столбцов!Этот случай называется СВОДНОЙ таблицей и будет выглядеть следующим образом:
user | mon | tue | wed
----- ----- ----- ----
35 | 10 | 9 | 0
Для получения инструкций о том, как добиться этого в MySQL, перейдите по ссылке: http://www.artfulsoftware.com/infotree/queries.php?amp;bw=1339#78
Один из вариантов, которые они показывают, был бы чем-то вроде:
SELECT alloc.user_id AS user,
SUM(IF(alloc.day = 'mon',alloc.hours,0)) as mon,
SUM(IF(alloc.day = 'tue',alloc.hours,0)) as tue,
SUM(IF(alloc.day = 'wed',alloc.hours,0)) as wed,
SUM(IF(alloc.day = 'thu',alloc.hours,0)) as thu,
SUM(IF(alloc.day = 'fri',alloc.hours,0)) as fri
FROM grwp_allocations AS alloc
LEFT JOIN grwp_jobs AS job ON (job.id = alloc.job_id AND job.id != '3')
WHERE alloc.user_id = '35'
AND alloc.deleted = '0'
AND alloc.acknowledged = '0'
GROUP BY alloc.user_id
Комментарии:
1. Спасибо, часть инструкции IF хороша. Это не идеально, но работает без необходимости заново создавать структуру в соответствии с моими соглашениями об именовании.