Foros del Web » Programando para Internet » PHP »

Obtener el mayor de los registros

Estas en el tema de Obtener el mayor de los registros en el foro de PHP en Foros del Web. Buenos días. ¿Hay alguna forma de obtener el mayor de los registros de una tabla? He probado con mysql_num_rows() pero me devuelve el número de ...
  #1 (permalink)  
Antiguo 15/03/2006, 03:02
Avatar de rafaconpu  
Fecha de Ingreso: febrero-2006
Mensajes: 331
Antigüedad: 11 años, 9 meses
Puntos: 3
Obtener el mayor de los registros

Buenos días.

¿Hay alguna forma de obtener el mayor de los registros de una tabla?

He probado con mysql_num_rows() pero me devuelve el número de registros totales.

Tengo un campo "id" que posee un número secuencial: 1, 2, 3,4 5, 6, 7, .....

Lo que quiero es saber cual es el mayor de todos para sumarle uno y pasar a ser el siguiente número a guardar.

Gracias.
  #2 (permalink)  
Antiguo 15/03/2006, 03:59
 
Fecha de Ingreso: abril-2005
Mensajes: 139
Antigüedad: 12 años, 7 meses
Puntos: 1
Hola rafacompu,

Esta es una funcion simple para mirar un registro determinado:

Código PHP:

function mirar_registro($campo,$tabla)
 {
// conectar a la db
 
$host="";
 
$usuario="";
 
$password="";
 
$db="";

 
$conect mysql_connect("$host""$usuario""$password");
   if (!
$conect){exit("No se ha podido conectar con la base de datos");}
   if (!
mysql_select_db("$db")){exit ("No se ha podido seleccionar la base de datos");}
  
$result mysql_query("select $campo from $tabla desc limit 0, 1");
  if (!
$result){exit ("No se ha podido mirar el registro.");}
@
$registro mysql_result($result,0);

return 
$registro;

Ahora la usamos:

Código PHP:

// miramos el registro de la id
$id=mirar_registro("TU_NOMBRE_CAMPO_ID","TU_TABLA");

// si no existe empezamos por 1 
if (!$id)
$id=1;
//sino le sumamos uno
else
$id++;

Revisa un poco el codigo porque lo he hecho ahora mismo, espero que te sirva.
__________________
Ciao y suerte.
  #3 (permalink)  
Antiguo 15/03/2006, 04:51
Avatar de rafaconpu  
Fecha de Ingreso: febrero-2006
Mensajes: 331
Antigüedad: 11 años, 9 meses
Puntos: 3
Me devuelve siempre 1

El codigo parece que está bien, pero no se porqué me devuelve otra vez 1.

Ya tengo un registro en la BBDD con el id=1.

Entonces la función teóricamente comprueba cual es el mayor registro de todos (el que tiene el id mayor) y como ve que es 1, me debería sumar 1 y devolverme 2. Es decir, el registro que guardo ahora es id=2.

Si hago otra vez lo mismo, me debería guardar id=3.

He comprobado con echo lo que me devuelve la función y no me devuelve nada.

La función la he puesto de esta forma:

Código PHP:
    function registro_mayor ($campo$tabla){
        
$result mysql_query("select $campo from $tabla desc limit 0, 1");
        @
$registro mysql_result($result,0);
        return 
$registro;        
    } 
No he establecido la conexión porque ya la tengo establecida de antes y supuestamente debe funcionar así.

¿Donde estará el fallo? Estoy revisando pero no doy con él.
  #4 (permalink)  
Antiguo 15/03/2006, 04:57
 
Fecha de Ingreso: julio-2005
Mensajes: 13
Antigüedad: 12 años, 5 meses
Puntos: 0
Si haces un
SELECT MAX(id) FROM tabla
ya tienes el valor más alto... le sumas uno y ya está.
  #5 (permalink)  
Antiguo 15/03/2006, 05:04
Avatar de rafaconpu  
Fecha de Ingreso: febrero-2006
Mensajes: 331
Antigüedad: 11 años, 9 meses
Puntos: 3
Ya está

Hola otra vez.

He estado mirando la función y he cambiado lo siguiente. Ahora si funciona:

Código PHP:
    function registro_mayor ($campo$tabla){
        
$result mysql_query("select $campo from $tabla order by $campo desc");
        @
$registro mysql_result($result,0);
        return 
$registro;        
    } 
He puesto la cláusula order by $campo desc con lo que me los ordena de mayor a menor. Entonces con el mysql_result me situo en el primer registro que contendrá el mayor de los ID.

Devuelvo el mayor de los id y le sumo uno con lo que ya tengo el ID correspondiente para la siguiente noticia a guardar.

Gracias por tu ayuda, me has ayudado bastante.
Saludos.
  #6 (permalink)  
Antiguo 15/03/2006, 06:58
Avatar de rafaconpu  
Fecha de Ingreso: febrero-2006
Mensajes: 331
Antigüedad: 11 años, 9 meses
Puntos: 3
También es verdad.
Creo que la opcion de Select MAX(id) es la mejor puesto que está más optimizada.

Muchas gracias
  #7 (permalink)  
Antiguo 15/03/2006, 10:00
Avatar de bistoco  
Fecha de Ingreso: marzo-2006
Mensajes: 141
Antigüedad: 11 años, 9 meses
Puntos: 0
Ojala leas esto porke es un problema habitual cuando uno comienza a trabajar con bases de datos :

- imaginate ke tienes dos usuarios conectados al mismo tiempo ( ke es la idea de poner una aplicacion en ambiente web )
- ambos estan tratando de insertar al mismo tiempo
- el mayor de los id es 5
- el usuario 1 pregunta por el mayor id y obtiene 5
- antes de ke usuario 1 ingrese el registro, usuario dos pregunta por el mayor de los registros
- ambos intentaran ingresar un registro con id 6 y solo el primero ke lo haga tendra resultados y el otro generara un error de mysql o el motor de base de datos ke ocupes

Solucion :

crea el id como auto_increment , eso evitara ke "choken" los datos , y si necesitas identificar el registro ingresado, agrega un campo a la tabla ke se llame id_date VARCHAR(20) donde guardas el siguiente dato generado en el php

$tiempo=date("Y-m-d H:i:s").substr((double)microtime(),1,7);

esto te da la fecha,hora con millonesimas de segundos , lo ke hara ke el registro sea unico e identificable independiente del id
  #8 (permalink)  
Antiguo 15/03/2006, 10:20
Avatar de rafaconpu  
Fecha de Ingreso: febrero-2006
Mensajes: 331
Antigüedad: 11 años, 9 meses
Puntos: 3
Leido

A la hora de agregar un registro siempre lo hará una determinada persona. No obstante lo que comentas es importante saberlo.

Entonces el campo ID lo establezco como auto-increment. Actualmente lo tengo puesto como Smallint.

¿Así se soluciona el problema verdad?

El tema este de microtime no lo he comprendido muy bien. ¿Realmente es necesario hacer esto tambien a parte de ponerlo auto-increment?
  #9 (permalink)  
Antiguo 15/03/2006, 12:19
Avatar de bistoco  
Fecha de Ingreso: marzo-2006
Mensajes: 141
Antigüedad: 11 años, 9 meses
Puntos: 0
te voy a dar un ejemplo de porke yoocupo $tiempo.

<?
$tiempo=date("Y-m-d H:i:s").substr((double)microtime(),1,7);
// sale algo como "2006-03-15 19:13:45.597383"

// suponiendo ke el id es auto_increment y ke no se ke valor me da cuando inserto un registro

$sql="INSERT INTO tabla_1(id,id_date) VALUES(0,'".$tiempo."')";
$r=mysql_query($sql,$conexion);
/*
se ejecuta correctamente , perono se k id ledio al registro y lo necesito para ocuparlo como foranea, o sea relacionar un registro en otra tabla al id de tabla_1
tonces obtengo el registro...¿como?, con el dato id_date=$tiempo , ke es imposible ke se repita
*/

$sql="SELECT id FROM tabla_1 WHERE id_date='".$tiempo."'";
$fila=mysql_fetch_array(mysql_query($sql,$conexion ));
$id=$fila['id'];

// y ahora puedes relacionar a id de tabla_1 lo ke kieras

?>

espero se haya entendido...saludos
  #10 (permalink)  
Antiguo 15/03/2006, 12:43
 
Fecha de Ingreso: noviembre-2005
Ubicación: venezulea
Mensajes: 214
Antigüedad: 12 años
Puntos: 0
por que hacerlo así, cuando hay una instrucción de mysql a través de la cual puedes hacerlo.

Ej:

$sq2="insert into Tasas(nombre_tasa) values ('".$input_txttasa."')";
$resp1=mysql_query($sq2);
$resp2=mysql_insert_id();

con mysql_insert_id() obtienes el id (este id es un campo autonumérico) que acabas de generar y luego consultas lo que desees
  #11 (permalink)  
Antiguo 16/03/2006, 07:48
Avatar de bistoco  
Fecha de Ingreso: marzo-2006
Mensajes: 141
Antigüedad: 11 años, 9 meses
Puntos: 0
vale compadre...siempre se aprende algo nuevo...de repente tay demasiado apurado y resuelves como se pueda porke no tienes tiempo de buscar algo hecho , pero ahora utiliuzare esa funcion,gracias.
  #12 (permalink)  
Antiguo 16/03/2006, 09:00
 
Fecha de Ingreso: noviembre-2005
Ubicación: venezulea
Mensajes: 214
Antigüedad: 12 años
Puntos: 0
cariño soy mujer, por ello no debes llamarme compadre
  #13 (permalink)  
Antiguo 17/03/2006, 04:32
Avatar de rafaconpu  
Fecha de Ingreso: febrero-2006
Mensajes: 331
Antigüedad: 11 años, 9 meses
Puntos: 3
ejemplo de microtiempo

Hola.

El ejemplo de guardar un registro con la fecha, hora y microtime está muy bien.

¿Cómo se podría hacer para que si en el remoto caso de que ya exista el registro (haya varios usuarios a la misma vez) guardandolo en la BBDD, se genere de nuevo la variable $tiempo?

Es decir:

1. Genero la variable $tiempo
2. Compruebo si el valor de $tiempo existe en la base de datos
3. Hago un if (mysql_num_rows($result)!=0) es que existe un registro, entonces ¿genero otra vez la variable $tiempo?
  #14 (permalink)  
Antiguo 17/03/2006, 10:10
Avatar de bistoco  
Fecha de Ingreso: marzo-2006
Mensajes: 141
Antigüedad: 11 años, 9 meses
Puntos: 0
primero...sorry cariño, no te volvere a llamar compadre

ahora para responder a rafacompu , la idea de ocupar microtime es ke te entregue una millonesima de segundo , eso relacionado con la fecha hace ke sea imposible ke se repita lo ke entrega microtime, ¿ Por ke imposible? , porke dos instrucciones de usuarios diferentesno puden ejecutarse ambas en el procesador la misma millonesima de segundo

Saludos
  #15 (permalink)  
Antiguo 17/03/2006, 11:41
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Iniciado por rafaconpu
Buenos días.

¿Hay alguna forma de obtener el mayor de los registros de una tabla?

He probado con mysql_num_rows() pero me devuelve el número de registros totales.

Tengo un campo "id" que posee un número secuencial: 1, 2, 3,4 5, 6, 7, .....

Lo que quiero es saber cual es el mayor de todos para sumarle uno y pasar a ser el siguiente número a guardar.

Gracias.
Pero .. usas campos de tipo "AUTONUMERICO"? para ese "id"? .. Si usas Mysql y ese tipo de propiedad para tus campos .. .ese "ID" autonumérico lo dá Mysql sin más problemas. De hecho se crea secuencial, se toma en cuenta la "integridad referencial" (no genera "ID's" eliminados ..). En fin . .está para eso.


Un saludo,
  #16 (permalink)  
Antiguo 20/03/2006, 05:00
Avatar de rafaconpu  
Fecha de Ingreso: febrero-2006
Mensajes: 331
Antigüedad: 11 años, 9 meses
Puntos: 3
Gracias por la ayuda.

He puesto autonumérico en mysql pero lo del microtime lo tendré en cuenta para como referencia para un futuro proyecto o para cuando haga falta porque está muy interesante.

Gracias por todo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:09.