Foros del Web » Programando para Internet » PHP »

Consulta anidada y campos repetidos

Estas en el tema de Consulta anidada y campos repetidos en el foro de PHP en Foros del Web. Hola. A ver si me podeis echar una mano que estoy un poco perdido. Tengo un script que coge todos los mensajes y besos que ...
  #1 (permalink)  
Antiguo 16/03/2009, 14:10
 
Fecha de Ingreso: julio-2004
Mensajes: 43
Antigüedad: 15 años, 5 meses
Puntos: 0
Consulta anidada y campos repetidos

Hola.

A ver si me podeis echar una mano que estoy un poco perdido.

Tengo un script que coge todos los mensajes y besos que se han mandado a un usuario, la idea en principio es poder mostrar en pantalla la suma de mensajes y besos por usuario, ejemplo:

usu 1
mensajes 2

usu 2
mensajes 1
besos 1

Pero lo que he consegido hasta ahora es esto:

usu 1
mensajes 1

usu 1
mensajes 1

usu 2
mensajes 1

usu 2
besos 1

La cuestion es que no se que estoy haciendo mal.
Este es el codigo:

Código PHP:
<?
$sql_mensajes 
mysql_query("select users.id, mensajes.iduser, mensajes.mensaje, mensajes.fecha, mensajes.idremitente from users as users, mensajes as mensajes where mensajes.iduser = users.id",$dbc);
while(
$row_mensajes mysql_fetch_array($sql_mensajes)){
    
$user $row_mensajes['iduser'];
    
$num_besos 0;
    
$num_mensajes 0;
    
$id_remitentes_besos '';
    
$id_remitentes_mensajes '';
    
$idremitente $row_mensajes['idremitente'];
    
$mensaje $row_mensajes['mensaje'];
    if (
$mensaje == '***beso***') {
        
$num_besos $num_besos 1;
        
$id_remitentes_besos 'ID:'.$idremitente.', '.$id_remitentes_besos;
    }
    else {
        
$num_mensajes $num_mensajes 1;
        
$id_remitentes_mensajes 'ID:'.$idremitente.', '.$id_remitentes_mensajes;
    }
    if ((
$num_besos 0) or ($num_mensajes 0)) {
        echo 
'<b>'.$user.'</b><br>';
        if (
$num_mensajes 0){
            echo 
'&nbsp;&nbsp;&nbsp;&nbsp;Mensajes: '.$num_mensajes.'<br>';
            echo 
'&nbsp;&nbsp;&nbsp;&nbsp;Remitentes: '.$id_remitentes_mensajes.'<br>';
        }
        if (
$num_besos 0) {
            echo 
'&nbsp;&nbsp;&nbsp;&nbsp;Besos: '.$num_besos.'<br>';
            echo 
'&nbsp;&nbsp;&nbsp;&nbsp;Remitentes: '.$id_remitentes_besos.'<br>';
        }
    }
}
?>
Gracias.
  #2 (permalink)  
Antiguo 16/03/2009, 14:23
Avatar de juamd  
Fecha de Ingreso: marzo-2009
Ubicación: Bogotá
Mensajes: 285
Antigüedad: 10 años, 8 meses
Puntos: 8
Respuesta: Consulta anidada y campos repetidos

que tal !!!!!!!!!

No si he entendido bien la pregunta, pero si lo que se pretende es saber cuantos besos ha recibido una persona y cada besos es almacenado en la base de datos se puede realizar una consulta donde se sumen los besos por cada usuario. asi:

SELECT usuario, sum(cantidad besos) FROM usuarios
group by usuario

espero sea de ayuda.
  #3 (permalink)  
Antiguo 20/03/2009, 05:21
 
Fecha de Ingreso: julio-2004
Mensajes: 43
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Consulta anidada y campos repetidos

Hola juamd, gracias por la respuesta.

En realidad es algo mas que eso, porque no es solo contar la cantidad de mensajes y la cantidad de besos de cada usuario, ademas tengo que listar los IDs de la persona que los ha enviado. Los mensajes y besos estan en la misma tabla de la db, solo que en los besos, el campo "mensaje" contiene la cadena ***beso*** , por eso lo de "if ($mensaje == '***beso***') {".

En realidad la funcinalidad la he consegido hacer, pero con un script diferente, con dos While, uno dentro de otro, el primero consulta la tabla usuarios, y el segundo la tabla mensajes. Asi recorro la tabla usuarios, y por cada usuario recorro la tabla mensajes en busca de todos los datos que necesito para cada uno, el problema, que tarda una eternidad en terminar. Por eso lo de hacerlo con un solo bucle y una consulta anidada.

Esta era la primera versión de mi código, la que funciona pero tarda demasiado.

Código PHP:
<?
$sql_users 
mysql_query("select id from users where sexo = 1 and buscasexo = 0",$dbc);
while(
$row_users mysql_fetch_array($sql_users)){
    
$user $row_users['id'];
    
$num_besos 0;
    
$num_mensajes 0;
    
$id_remitentes_besos '';
    
$id_remitentes_mensajes '';
    echo 
'<b>'.$user.'</b><br>';
    
$ahora time();
    
$ahora_G date("G",$ahora);
    if (
$ahora_G 15) {
        
$ahora_mod $ahora 64800;
    }
    else {
        
$ahora_mod $ahora 21600;
    }
    
$sql_mensajes mysql_query("select idremitente,mensaje,fecha from mensajes where iduser = '".$user."' and fecha > '".$ahora_mod."'",$dbc);
    while(
$row_mensajes mysql_fetch_array($sql_mensajes)){
        
$idremitente $row_mensajes['idremitente'];
        
$mensaje $row_mensajes['mensaje'];
        if (
$mensaje == '***beso***') {
            
$num_besos $num_besos 1;
            
$id_remitentes_besos 'ID:'.$idremitente.', '.$id_remitentes_besos;
        }
        else {
            
$num_mensajes $num_mensajes 1;
            
$id_remitentes_mensajes 'ID:'.$idremitente.', '.$id_remitentes_mensajes;
        }
    }
    if ((
$num_besos 0) or ($num_mensajes 0)) {
        if (
$num_mensajes 0){
            echo 
'&nbsp;&nbsp;&nbsp;&nbsp;Mensajes: '.$num_mensajes.'<br>';
            echo 
'&nbsp;&nbsp;&nbsp;&nbsp;Remitentes: '.$id_remitentes_mensajes.'<br>';
        }
        if (
$num_besos 0) {
            echo 
'&nbsp;&nbsp;&nbsp;&nbsp;Besos: '.$num_besos.'<br>';
            echo 
'&nbsp;&nbsp;&nbsp;&nbsp;Remitentes: '.$id_remitentes_besos.'<br>';
        }
    }
}
?>
Gracias.
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 10:23.