На самом деле вам не нужен цикл для перебора набора результатов, так как функции в инструкции SELECT выполняются для каждой записи результата.
Вы можете использовать функции потока управления, как описано на странице документации MySQL , для обработки соответствующих данных в вашем результате. В этом вопросе stackoverflow есть несколько примеров «IF» в операторе «SELECT» - выберите выходное значение на основе значений столбца или вы также можете использовать комбинацию различных операторов комбинации данных в MySQL
Мне удалось получить ожидаемый результат на основе предоставленного вами изображения, используя комбинацию UNION
, JOIN
и подзапросов.
SELECT *, mqa.Current_Status as Result
FROM MyQuery mqa
WHERE
mqa.Block = 1
AND mqa.Status_History IS NULL
UNION
SELECT mqb.*, mqb.Status_History as Result
FROM MyQuery mqb
WHERE
Status_History IS NOT NULL
UNION
SELECT mqc.ID,
mqc.Period,
mqc.Current_Status,
mqc.Status_History,
mqc.Block,
(SELECT TOP 1 mqd.Status_History FROM MyQuery mqd
WHERE mqd.ID = mqc.ID
AND mqd.Block < mqc.Block
AND mqd.Status_History IS NOT NULL
ORDER BY Block DESC)
FROM MyQuery mqc
WHERE
mqc.Status_History IS NULL
AND mqc.Block <> 1
| ID | Period | Current_Status | Status_History | Block | Result |
|--------|--------|----------------|----------------|-------|--------|
| 012014 | 201710 | 5 | (null) | 6 | 7 |
| 012014 | 201711 | 5 | 7 | 5 | 7 |
| 012014 | 201712 | 5 | (null) | 4 | 3 |
| 012014 | 201810 | 5 | (null) | 3 | 3 |
| 012014 | 201811 | 5 | 3 | 2 | 3 |
| 012014 | 201812 | 5 | (null) | 1 | 5 |
| 012015 | 201710 | 2 | (null) | 6 | 10 |
| 012015 | 201711 | 2 | (null) | 5 | 10 |
| 012015 | 201712 | 2 | (null) | 4 | 10 |
| 012015 | 201810 | 2 | (null) | 3 | 10 |
| 012015 | 201811 | 2 | (null) | 2 | 10 |
| 012015 | 201812 | 2 | 10 | 1 | 10 |
Вы можете поиграть с кодом выше в этом SQLFiddle
Попробуйте установить его в persistance.xml
<persistence>
<persistence-unit name="PU">
<properties>
<property name="hibernate.show_sql" value="false"/>
</properties>
</persistence-unit>
</persistence>
Насколько я знаю, В спящем режиме, также зарегистрирует SQL-операторы при входе для org.hibernate.SQL
происходит в DEBUG
или ALL
уровень, таким образом, Вы могли попытаться отключить это (например, с log4j.logger.org.hibernate.SQL=info
при использовании Log4J).
Если вы используете spring, убедитесь, что для свойства showSql не установлено значение true
Я делал это сам
<bean id="vendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="false"/>
</bean>