Псевдоним вывода в запросе выбора MySQL

#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 хороша. Это не идеально, но работает без необходимости заново создавать структуру в соответствии с моими соглашениями об именовании.