MySQL - использование своего рода foreach в процедуре SQL - PullRequest
0 голосов
/ 22 июня 2011

Я много занимался поиском способа создания своего рода «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;?>

Ответы [ 2 ]

1 голос
/ 22 июня 2011

MySQL имеет циклические конструкции, если вы определяете их в хранимой процедуре, как определено здесь: Для примера цикла в MySQL

Однако конструкции циклов SQL не являются сильной стороной MySQL, потому что онине легко читается и относительно неэффективен по сравнению с тем, когда циклы выполняются в другом месте, как в Java / Python / PHP.

SQL лучше всего использовать для случаев, когда структура данных, используемая для представления данных, надлежащим образом векторизована, и вы можете просто выполнять операции, такие как: update stuff from mytable where column = 'foobar' объединение таблиц с ключами при необходимости.

Если вам нужны циклические конструкции в SQL, то либо данные неправильно размещены в базе данных, либо задача, которую вы пытаетесь выполнить, настолько сложна, что не может быть интуитивно представлена ​​в SQL.

1 голос
/ 22 июня 2011

Похоже, вы хотите создать хранимую процедуру. Предполагая, что «массив» исходит из результата запроса, вам придется использовать курсоры. В документации MySQL есть пример, к которому вы можете обратиться по http://dev.mysql.com/doc/refman/5.0/en/cursors.html или http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...