好吧,我想用這個CASE STATEMENT
,但我迷失了這個。基本上,我需要更新大量的行,但只是在「職位」列。我需要UPDATE
所有的位置值都大於位置值,該位置值以id_layout和id_layout_position爲基礎被移除到position - 1
。SQL:使用CASE語句一次更新1000行
OK,這裏是什麼樣的表看起來像一個PIC: alt text http://acs.graphicsmayhem.com/images/dp_positions_table.png
現在讓我們假設我刪除盤旋行,這將刪除位置= 2,給我:0,1,3,5,它應該重新定位大於2的位置值,以便它看起來像這樣:0,1,2,4,5,6和3.
好的,這是我的(注意:$ module_info ['clones'] =要刪除的克隆數組,在上表中沒有,因爲所有的id_clone值都是0 ,$ module_info ['id']是我們正在移除的id_module值):
// Get rid of id_clone = 0, because we can't use them.
$module_info['clones'] = array_values(array_filter($module_info['clones']));
// Selecting the positions.
if (isset($module_info['clones'][0]))
$query = 'id_module = {int:id_module} || id_clone IN ({array_int:id_clones})';
else
$query = 'id_module = {int:id_module}';
$request = $smcFunc['db_query']('', '
SELECT
id_position, id_layout_position, id_layout, position
FROM {db_prefix}dp_module_positions
WHERE ' . $query,
array(
'zero' => 0,
'id_module' => $module_info['id'],
'id_clones' => $module_info['clones'],
)
);
while ($row = $smcFunc['db_fetch_assoc']($request))
{
$module_info['position'][$row['id_layout']]['pos' . $row['id_position'] . $row['position'] . '_' . $row['id_layout_position']] = $row['position'];
$module_info['id_positions'][] = $row['id_position'];
}
$smcFunc['db_free_result']($request);
// Remove all module and clone positions from the layout!
$smcFunc['db_query']('', '
DELETE FROM {db_prefix}dp_module_positions
WHERE id_position IN ({array_int:id_positions})',
array(
'id_positions' => $module_info['id_positions'],
)
);
foreach($module_info['position'] as $id_layout => $id_layout_pos)
{
foreach($id_layout_pos as $key => $position_val)
{
$lPos = explode('_', $key);
$lPosId = (int) $lPos[1];
$smcFunc['db_query']('', '
UPDATE {db_prefix}dp_module_positions
SET
position = position - 1
WHERE position > {int:position} AND id_layout = {int:id_layout} AND id_layout_position = {int:id_layout_position}',
array(
'id_layout' => (int) $id_layout,
'position' => (int) $position_val,
'id_layout_position' => $lPosId,
)
);
}
}
NEW QUESTION:
這裏還有得是某種方式在這個UPDATE
現在使用CASE語句。例如,我現在需要將所有職位更新到位置-1,每個id_layout和每個id_layout_position基礎。但只有位置大於id_layout和id_layout_position值的當前位置的位置。
有沒有辦法做到這一點,而不使用FOREACH LOOP
?
你的問題是很難理解...... – 2010-05-05 10:54:46
好了,問題是,我該如何使用在第一個代碼示例一個'CASE statement',這樣我可以更新所有[0] - 找到的總行數是否在'position'列中的行中,具有'id_layout'值和'id_layout_position'值,並且該表中的所有不同'id_layout'值都會繼續執行此操作? – SoLoGHoST 2010-05-05 10:58:53
你仍然在尋求你的解決方案:說明你實際上想要達到的目標,而不是你認爲你應該怎麼做? – 2010-05-05 11:01:35