2013-12-19 3 views
0

Мне нужно выбрать верхнюю строку AND l1.activityId = t2.activityId Затем мне нужно иметь возможность установить ВСЕ строки a.scheduleType равными 'error '- не только строки, в которых указано выше. В настоящее время я могу изменить значение, основанное на результатах каждой строки l1.activityId = t2.activityId, но это не поможет мне в отношении всех результатов, которые мне нужны.Нужно установить все значения строк на основе результатов верхней строки

CREATE PROCEDURE reportFreeCoolingTrackerNoErrors (
     IN fromDate varchar (50), 
     IN toDate varchar (50), 
     IN timeZone varchar (50)) 

    BEGIN 
      DECLARE startDate varchar (50); 
      DECLARE endDate varchar (50); 
      DECLARE mylogID Int; 

      SET startDate = FROM_UNIXTIME(fromDate/1000); 
      SET endDate = FROM_UNIXTIME(toDate/1000); 

SELECT 
    l1.item31985,l1.item31987,a.scheduleType, 
    ((l1.item31985 - l1.item31987)*(time_to_sec(timediff(t2.completed, l1.completed))))/3600 AS kwDifference, 
    ((l1.item31985 - l1.item31987) * (substr(l.details, instr(l.details , ':') +1))) AS cost, 
    (((l1.item31985 - l1.item31987) * (substr(l.details, instr(l.details , ':') +1))) 
    *(time_to_sec(timediff(t2.completed, l1.completed))/3600)) AS costT, 
     time_to_sec(timediff(t2.completed, l1.completed))/3600 AS coolingHours, 
     time_to_sec(timediff(endDate, startDate))/3600 AS totalTimeRange, 
    (CONVERT_TZ((FROM_UNIXTIME(fromDate/1000)),'UTC', timeZone))AS startingDate, 
    (CONVERT_TZ((FROM_UNIXTIME(toDate/1000)),'UTC', timeZone)) AS endingDate,DATABASE() AS databaseName, 
    CASE 
     when l1.activityId = t2.activityId THEN 1 
     ELSE 0 
    END AS errorCheck 

    FROM logs l 
     INNER JOIN groups g ON g.groupId = l.groupId 
     LEFT JOIN groups g1 ON g.parentId = g1.groupId 
     LEFT JOIN groups g2 ON g1.parentId = g2.groupId 
     LEFT JOIN groups g3 ON g2.parentId = g3.groupId     
     INNER JOIN activities a ON l.logId = a.logId 
     INNER JOIN log1644 l1 ON a.activityId = l1.activityId 
     INNER JOIN log1644 t2 ON t2.recordId = l1.recordid + 1 
     INNER JOIN items i ON l.logId = i.logId AND i.name LIKE '%KW%' 
     INNER JOIN users u ON l1.userId = u.userId AND i.name LIKE '%KW%' 
    WHERE i.itemID = "31985" AND l1.activityId = 1257 
     AND l1.started 
     BETWEEN startDate 
      AND endDate 
    ORDER BY l1.recordId,l1.started; 

    END // 

DELIMITER ; 
+0

Не могли бы вы использовать два запроса для его достижения? – Uours

+0

Я не уверен, как бы я это сделал. Я пробовал много разных вариантов! – Portlight

ответ

0

Чтобы выбрать верхнюю строку, выбрать только первую строку в наборе данных по убыванию порядок:

SELECT <fields> 
FROM TABLE 
ORDER BY <your field> DESC 
LIMIT 1 ; 

Так как вы делаете это в хранимой процедуре, вы можете выбрать a.scheduleType в а затем выполнить выбор с этой переменной в предложении where.

+0

Это будет SELECT верхняя строка - я ХОЧУ выбрать все строки, но в зависимости от того, что возвращает верхняя строка, мне нужно установить ВСЕ строки типа a.schedule на ошибку – Portlight

+0

Поскольку вы делаете это в хранимой процедуре, вы можете сделать это в два этапа: Сначала вы можете выбрать a.scheduleType в переменной, используя запрос, а затем выполнить выбор с этой переменной в предложении where. –

Смежные вопросы