2011-06-22 47 views
0

我一直在做很多搜索的方式來創建一個與MySQL查詢排序的「Foreach」。MySQL - 在SQL過程中使用各種各樣的foreach

我知道如果是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`[email protected]_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;?> 

回答

1

的MySQL確實有循環結構,如果你在存儲過程中定義它們,如下定義:For loop example in MySQL

但是SQL循環結構不是MySQL的強項,因爲他們不容易閱讀和效率相對較低時相比,循環在其他地方完成,如在Java/Python/PHP中。

當用於表示數據的數據結構被適當地向量化時,SQL可以很好地使用,並且您可以簡單地執行操作,例如:update stuff from mytable where column = 'foobar'如果需要,可以在鍵上連接表。

如果您需要SQL中的循環結構,那麼數據在數據庫中的佈局不正確,或者您嘗試執行的任務非常複雜,以至於無法在SQL中直觀地表示。

1

聽起來你想創建一個存儲過程。假設「數組」來自查詢的結果,您將不得不使用遊標。 MySQL的文檔有一個示例,您可以參考http://dev.mysql.com/doc/refman/5.0/en/cursors.htmlhttp://dev.mysql.com/doc/refman/5.0/en/create-procedure.html

+0

其實,我越想越...是的,這完全是一個存儲過程。但我的主要問題是數組實際上來自一堆預設的列名稱。我實際上創建了100%的PHP代碼來完成我的想法,我將更新我的問題,但是,由於某種原因,我並沒有完全將其視爲一個過程。 – Anther

+0

@Anther - 我會提供一個例子,但它對於你的數據庫設計是非常具體的(即我需要知道字段類型),所以我想我會指出你在正確的方向。 –

+0

@Francois我更新了我的問題,使其更加清楚我想要實現的目標,也許你會回來告訴我這確實是我希望看到的遊標,但我覺得這比這更簡單一些。 ---我實際上認爲,如果我不能在沒有複製和粘貼大量語句的情況下找到一種在SQL中執行此操作的方法,直接讓PHP直接執行此操作可能是最好的。 – Anther