2013-02-14 2 views
0

источник данных:я не могу создать вид, который содержит подзапрос в ЕКОМ

Start Time    Real End Time   Staff 
2013-02-14 16:44:27  2013-02-14 18:44:27  P 
2013-02-14 16:44:08  2013-02-14 17:09:08  C 
2013-02-14 16:42:51  2013-02-14 16:43:51  P 
2013-02-14 16:31:26  2013-02-14 17:06:26  V 
2013-02-14 16:04:02  2013-02-14 16:34:02  C 

когда я использую:

CREATE VIEW turn_times AS 
SELECT staff AS name, start_time, real_end_time AS work_end_time 
FROM ( SELECT staff, start_time, real_end_time 
     FROM treatments 
     WHERE date(real_end_time) = curdate() 
     ORDER BY real_end_time ASC) AS a 
GROUP BY name 

я получил:

mysql #1349 - View's SELECT contains a subquery in the FROM clause 

I хотите получить следующие данные: , используя вид, есть ли хорошее решение:

name start_time    work_end_time 
C  2013-02-14 16:04:02 2013-02-14 16:34:02 
P  2013-02-14 16:42:51 2013-02-14 16:43:51 
V  2013-02-14 16:31:26 2013-02-14 17:06:26 

Я не хочу создавать два представления для этой проблемы, могу ли я получить правильный sql в одном представлении?

ответ

0

Вместо того, чтобы использовать подзапрос с ORDER BY, пытались ли вы с помощью агрегатной функции (MIN), чтобы вернуть min() дату для каждого staff:

SELECT staff, 
    min(start_time), 
    min(real_end_time)AS work_end_time 
FROM treatments 
WHERE date(real_end_time) = curdate() 
group by staff 

См SQL Fiddle with Demo.

Затем, чтобы включить в представление:

CREATE VIEW turn_times AS 
SELECT staff,  
  min(start_time), 
  min(real_end_time)AS work_end_time 
FROM treatments  
WHERE date(real_end_time) = curdate() 
group by staff 

Эта версия выше повторяет результат, который вы предоставили, но если вы хотите, время окончания, вы можете использовать следующее. Это даст вам фактическое время начала для каждого сотрудника и время окончания:

CREATE VIEW turn_times AS 
SELECT staff, 
    min(start_time) as start_time, 
    max(real_end_time) AS work_end_time 
FROM treatments 
WHERE date(real_end_time) = curdate() 
group by staff 

Посмотреть SQL Fiddle with Demo

+0

Да, я пробовал использовать max, но это было неправильно. в любом случае, спасибо большое – Victor

+0

@Victor Я использовал 'min', потому что вы сортировали данные в порядке возрастания. Вы также могли бы использовать 'min (start_time)' и 'max (real_end_time)'. – Taryn

+0

Эй, похоже, проблема. Не задал вопрос, как его похожий вид, и подумал, что он может быть разрешен здесь. Я нахожу «подсчеты» в подзапросе, а затем «суммы» этих 'counts' во внешнем запросе. Такая же ошибка. Как я могу это решить? Я начну новый вопрос, если вы захотите. Благодаря! :) – CodingInCircles

0

Не понятно, почему вы используете подзапрос, но вы можете достичь подобного результата без суб- запрос

CREATE VIEW turn_times AS 
SELECT staff AS name, 
    MIN(start_time) AS start_time, 
    MAX(real_end_time) AS work_end_time, 
    date(start_time) As turn_date 
FROM treatments 
WHERE 
AND date(start_time) = curdate() 
AND date(real_end_time) = curdate() 
GROUP BY staff, date(start_time); 
Смежные вопросы