[sql] Sacar y modificar varias filas de una columna a la vez?

Iniciado por Servia, 12 Abril 2009, 12:38 PM

0 Miembros y 1 Visitante están viendo este tema.

Servia

He leido varios tutoriales para por lo menos saber como sacar en una misma consulta unas cuantas filas que necesitaba, el problema esque no se como modificarlas en la misma consulta ya que el metodo usado para conseguirlas es LIKE 'jugador%' .

Expongo:

Tabla: jugadores
Columnas: ID y nick

La id siempre es jugador + un numero que va aumentando. jugador1,jugador2,jugador3,etc..

Para sacar el nick de estos jugadores lo he hecho asi:
Código (php-brief) [Seleccionar]
$sql=mysql_query("SELECT * FROM jugadores WHERE id LIKE 'jugador%' ORDER BY id ASC");

Pero para actualizarlos no puedo poner el like ya que no controlaria correctamente si el nick del jugador1 se pone en el jugador1 o en el 2 o en el que quiera, aparte de que dudo que se pueda usar. O si que puede funcionar añadiendo tambien la linea de ORDER BY id ASC de modo que se inserte por orden?
Código (php-brief) [Seleccionar]

$sql="UPDATE jugadores SET ... WHERE id LIKE 'jugador%'";


Aún estoy buscando tutoriales ya que el que he usado sólo es para mostrar los datos de todas las posibilidades posibles.

XafiloX

Si lo que quieres hacer es actualizarle a cada uno un dato diferente, lo que estas diciendo creo que es imposible, aunque a lo mejor lo podrias conseguir por medio de procedimientos: http://dev.mysql.com/doc/refman/5.0/es/stored-procedures.html

Si lo que quieres hacer es insertarles a todos el mismo dato, solo tienes que hacer:
Código (php) [Seleccionar]
$sql="UPDATE jugadores SET ... '";...No tendrias que  usar el WHERE a no ser que haya IDs que no quieras actualizar...

^Tifa^

Voy a suponer que quieres actualizar todos los jugadores en una consulta. Suponte que el registro que quieres actualizar de la tabla jugadores es el campo nombres....

Pues generas en tu codigo una consulta que obtenga todos los nombres de los jugadores y guardas el resultado en una variable arreglo.

Código (sql) [Seleccionar]
  SELECT NOMBRES FROM JUGADORES WHERE ID = JUGADOR%

Ahora te preguntaras porque opte por utilizar el operador igual ( = ) y no LIKE, por la siguiente razon... mi intencion es optimizar la consulta SQL si mi predicado es una constante le sera mas sencillo a la base de datos ir exactamente al grano del asunto, pero si uso LIKE a la base de datos tendra que indagar toda la data y todos los indices antes de llegar a su objetivo... y esto es algo mediocre con el desenvolvimiento, si es con 100 o 1,000 o 5,000 registros la diferencia no es grande pero si hablamos de miles o millones ... mejor ve optimizando el codigo desde el inicio asi te evitas problemas futuros recuerda MySQL adora la RAM, Ahora para responder a tu duda sobre si utilizo el operador igual y no LIKE como vas a obtener los registros?  ya que tus id van en un rango numerico creciente jugador1, jugador2, jugador3 ... etc.. y con LIKE obtienes todos a la vez pero con el operador igual no.. al menos que el ID sea siempre una constante. He aqui donde entra la programacion, haras un bucle FOR.. LOOP



for ($numero = 0; $numero <= 10; $numero++) {

$sql = mysql_query("[code=sql]  SELECT NOMBRES FROM JUGADORES WHERE ID = JUGADOR[numero]
", $conexión);

}
[/code]

Cuando obtienes el listado de los nombres de los jugadores por ejemplo, lo guardas todos en una variable normal, no se como se haga en PHP para el valor que contiene X variable guardarla en un arreglo creo que es con la funcion explode o implode... pero no se bien. Ya dividido los resultados en una variable arreglo podrias actualizar todos los campos requeridos por ejemplo asi :

Código (php) [Seleccionar]


foreach (@areglo) {

mysql_query("UPDATE JUGADORES SET.... WHERE NOMBRES = $arreglo", $conexión)


}



sempus

Servia, hay varias formas de hacerlo, la que tu mencionas es una de ellas (a mi si me funciona, cree la tabla solo para probar y el UPDATE me funciona sin problemas.)

Tambien probe la que menciona XafiloX que es bastante logica y tambien funciona, la de ^TiFa^ no la pruebo porque si viene de ella estoy seguro que tambien funciona, y cree una mia que tambien lo hace xD


Código (sql) [Seleccionar]
UPDATE jugadores SET nombre="Prueba-Actualizado" WHERE id in (select id from jugar WHERE id like "jugador%")

ya tienes tres opciones ;)

salu2
...si la tuviera detendría el tiempo para verla como lo hago en este momento y seria feliz eternamente...
Descarga openSUSE

Servia

Muchas gracias, me funcionó perfectamente ^^

Pues a mi no me iba bien la que yo comenté.

^Tifa^

En perl que es el lenguaje scripting que mas comprendo, lo hice justo como le sugeri al amigo y funciona.

Código (perl) [Seleccionar]


our $consulta;

my @nombres = (" ", "Juan", "Juana", "Pepe", "Carlos");

my $conexión = DBI->connect("dbi:mysql:primaria", "marian", "123", {
RaiseError => 0, PrintError => 0}) or die "No me puedo Conectar :( \n";



for ( my $numero = 0; $numero < 5; ++$numero ) {

$consulta = $conexión->prepare( qq{ SELECT * FROM jugadores WHERE id =
$numero }) or warn DBI::errstr;
$consulta->execute();

while ( my $todo = $consulta->fetchrow_hashref) {

foreach (@nombres) {

my $consulta2 = $conexión->prepare( qq{ UPDATE jugadores SET
nombres = '$nombres[$numero]' WHERE id = $todo->{id}} ) or
warn DBI::errstr;
$consulta2->execute() or warn DBI::errstr;

$consulta2->finish();
}


}
$consulta->finish();

}


$conexión->disconnect();





Y no porque lo diga yo indica que funcione 100% :)

Servia


^Tifa^

Coloque el ejemplo pensando que era interpretable para moverlo  a otro lenguaje que conozcas por ejemplo...

Mas o menos en PHP la traduccion de lo que hice seria asi :

Código (php) [Seleccionar]


$servidor = 'localhost';
$usuario = 'usuario';
$contrasena = 'password';
$db = 'basesita';

$nombres = array("Juana", "Juan", "Pedro", "Pepin");

$conexión = mysql_connect($servidor, $usuario, $contrasena) or die("Error con la conexión\n");
mysql_select_db($db,$conexión) or die("Problemas con la Base Datos\n");

$consulta = mysql_query("SELECT * FROM jugadores", $conexión);


for ($numero = 0; $numero < mysql_num_rows($consulta); $numero++) {

$consulta1 = mysql_query("SELECT * FROM jugadores WHERE id = $numero", $conexión);

while ($registros = mysql_fetch_array($consulta1)) {

foreach ($nombres as $nombrecitos) {

$consulta2 = mysql_query("UPDATE jugadores SET nombres = $nombrecitos WHERE id = $registros['id']", $conexión) or die(mysql_error());


mysql_free_result($consulta2);
}

}
mysql_free_result($consulta1);

}

mysql_free_result($consulta);




Pero es un mas o menos... no se si funcione, no soy muy agil con PHP. Pero se deberia entender el ejemplo.