Я много занимался поиском способа создания своего рода «Foreach» с запросом MySQL.
Я знаю, как бы я поступил, если бы это был PHP или Java, но я хочу, чтобы это был весь MySQL.
Итак, я собираюсь создать своего рода «теоретическую» ситуацию с MySQL, поскольку в исходном запросе содержится много ненужной информации, которая, по моему мнению, смущает суть вопроса.
То, что я предполагаю, - это то, что работает таким образом (это будет ужасный беспорядок псевдокода php и mysql.)
@rooms = ('master_bedroom'=>'MBS_MASTER_BEDROOM_SIZE',
'bed_room2' = 'B2S_BR_2_SIZE')
FOREACH(@rooms as @room=>@column_name)
{
UPDATE `relative_room_sizes` SET area = CALCULATE_AREA(`buildings`.@column_name)
WHERE `idx_computed_values`.`room_type` = @room
AND `idx_computed_values`.`computed_size` = 'large'
}
Я просто слишком далеко зашел, или есть какая-то базовая особенность MySQL, которую мне просто трудно обнаружить? Я много занимался поиском здесь, но любой вид foreach имеет отношение к использованию настоящего языка программирования, чтобы позаботиться о такой грязной работе.
Редактировать :
Вот вроде идея о том, чего я хочу достичь в процедуре, но я сделал это на PHP, потому что ... это то, что я знаю :)
По сути, я хочу, чтобы у меня была процедура, которая будет выполнять то, что будет выводить этот код PHP, и, надеюсь, так же компактно.
<?php
$rooms = array(
'master_bedroom' => 'MBS_MASTER_BEDROOM_SIZE',
'bed_room2' => 'B2S_BR_2_SIZE',
'bed_room3' => 'B3S_BR_3_SIZE',
'bed_room4' => 'B4S_BR_4_SIZE',
'living_room' => 'LRS_LIVING_ROOM_SIZE',
'dining_room' => 'DRS_DINING_ROOM_SIZE ',
'kitchen' => 'KTS_KITCHEN_SIZE',
'family_room' => 'FRS_FAMILY_ROOM_SIZE');
$room_sizes = array('large','small');
$table_with_properties = 'idx_search';
?>
<?foreach($rooms as $room_type=>$column_name):?>
<?foreach ($room_sizes as $room_size):?>
#Initialize field in case it isn't already declared
INSERT INTO `idx_computed_values` (`room_type`,`computed_size`,`area`)
values ('<?=$room_type?>','<?=$room_size?>',0)
ON DUPLICATE KEY UPDATE `computed_size` = `computed_size`;
UPDATE `idx_computed_values` SET area =
(SELECT AVG(CALCULATE_AREA(`<?=$table_with_properties?>`.<?=$column_name?>))<? if($room_size == 'large'):?>+<?php endif;?><? if($room_size == 'small'):?>-<?php endif;?>
(0.6 * STDDEV(CALCULATE_AREA(`idx_search`.<?=$column_name?>)))
FROM `<?=$table_with_properties?>`
WHERE `<?=$column_name?>` IS NOT NULL )
WHERE `idx_computed_values`.`room_type` = '<?=$room_type?>'
AND `idx_computed_values`.`computed_size` = '<?=$room_size?>';
<? endforeach;?>
<? endforeach;?>