Pergunta

Eu tenho uma consulta SQL que assume a seguinte forma:

UPDATE foo
SET flag=true
WHERE id=?

Eu também tenho uma matriz PHP que tem uma lista de IDs.Qual é a melhor maneira de fazer isso outros do que com a análise, como se segue, ...

foreach($list as $item){  
    $querycondition = $querycondition . " OR " . $item;  
}

...e usando a saída no WHERE cláusula?

Foi útil?

Solução

Isso iria atingir a mesma coisa, mas provavelmente não rendem muito de um aumento de velocidade, mas parece mais agradável.

mysql_query("UPDATE foo SET flag=true WHERE id IN (".implode(', ',$list).")");

Outras dicas

Você deve ser capaz de utilizar a cláusula (assumindo que o seu banco de dados suporta-lo):

UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6)

Uso EM instrução.Fornecer lista separada por vírgulas de valores de chave.Você pode fazer isso facilmente usando implode função.

UPDATE foo SET flag = true WHERE id IN (1, 2, 3, 4, 5, ...)

Alternativamente, você pode usar condição:

UPDATE foo SET flag = true WHERE flag = false

ou subconsulta:

UPDATE foo SET flag = true WHERE id IN (SELECT id FROM foo WHERE .....)

Usar join/implodir fazer uma lista delimitada por vírgulas para acabar com:

UPDATE foo SET flag=true WHERE id IN (1,2,3,4)

Eu ainda não viu uma forma de o fazer que outros do que seu loop foreach.

Mas, se $a lista é de forma alguma, obtido a partir do usuário, você deve parar de usar a instrução preparada e apenas atualizar uma linha de cada vez (supondo que alguém não tem uma forma de atualizar várias linhas com uma instrução preparada).Caso contrário, você está aberto para a injeção de sql.

você pode geléia de atualização com instruções de caso, mas você terá que construir a consulta sobre o seu próprio.

UPDATE foo
SET flag=CASE ID WHEN 5 THEN true ELSE flag END  
    ,flag=CASE ID WHEN 6 THEN false ELSE flag END 
WHERE id in (5,6)  

Onde pode ser omitido, mas salva você de uma mesa cheia de atualização.

VB.NET código: dim delimitedIdList como string = arrayToString(listOfIds)

dim SQL as string = " UPDATE foo CONJUNTO bandeira=true WHERE id in (" + delimitedIdList + ")"

executarsql(SQL)

Se você sabe um limite para o número de itens, em seguida, usar o "NA" cláusula, como outros têm sugerido:

UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6)

Uma advertência, porém, é que, dependendo de seu banco de dados, pode haver um limite para o número de elementos na cláusula.Por exemplo, oracle 7 ou 8 (?) costumava ter um limite de 256 itens (este valor foi aumentado significativamente em versões posteriores)
Se você iterar sobre uma lista de usar uma transação, assim você pode se reverter uma das atualizações de falha

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top