Nueva pregunta

Pregunta:

Fecha: 02-04-2018 10:12:43 (En Español)

Comparar tablas en MySQL y obtener coincidencia y no coinsidencias[Resuelta]

buenas tardes ustedes son de mucha ayuda. necesito ayuda en un tema. tengo dos tablas con campos iguales. referencias y monto para que coincidan con mi otra tabla . si coinciden que se muestre en una tabla y si no que también se muestre. e leido sobre inner join pero no se como aplicarlo a mi codigo php estoy aff demas de pensar. se que es facil lo que pido pero que va no se como hacerlo. necesito de su ayuda sugerencias o algo auxiliooooooooo

Etiquetas: MySQL - PHP - PHP MySQLi - Pregunta - SQL Votos: -1 - Respuestas: 20 - Vistas: 21 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 02-04-2018 17:39:41 No entendí ni papas, debes colocar los códigos o las estructuras de tus tablas para poderte ayudar, a ciegas es complicado, como te comente, agrega la estructura de tus tablas y a que quieres llegar y bueno ahí vemos.   Votos: 2 - Link respuesta
     
  • Fecha: 03-04-2018 03:54:21 bien explico mejor tengo dos tablas en una base de datos , ambas y tienen filas iguales se llaman ( referencia y monto ) una se llenan con los datos de clientes y la otra se llena con un archivo csv que subo a esa base de datos. lo que quiero hacer es comparar esa filas y saber cuales son las que tienen coincidencia y las que no tienen. para saber que clientes pagaron o no no. llevo semanas leyendo sobre el tema pero aun no el logrado nada. con lo que prove recientemente fue esto.
    //Aqui hago mi conexion 
     
    //selecciono el ID de determinados registros de la tabla01
    $select_1 = mysql_query("SELECT referencia FROM pagos_pagina WHERE activo = '1'");
     
    //selecciono la columna ID de la tabla02
    $select_2 = mysql_query("SELECT referencia FROM archivos_pagos");
     
    //busco las coincidencias
    //numero que guardara las coincidencias
    $num = 0;
    //busco en todos los resultados de select_1
    while($data = mysql_fetch_array($select_1)){
        //busco en todos los resultados de select_2
        while($data2 = mysql_fetch_array($select_2)){
            if($data['id_empresa'] == $data2['id_empresa']){
                $num++;
            }
        }
    }
    if($num >  0){
        echo "Existen ".$num." coincidencias";
    }else{
        echo "No existen coincidencias";
    }



    pero no me funciona no se que hago mal o si puedo usar otras opciones seria mejor la que me funcione . y gracias de antemano
      Votos: 0 - Link respuesta
     
  • Fecha: 03-04-2018 04:12:39 encontre esto pero no se como ejecutar el codigo sql e mi pagina php .
    mysql> SELECT user_old.*, 'SIN CAMBIOS' estatus
        -> FROM user_old
        -> INNER JOIN user_new ON
        -> user_old.oprid = user_new.oprid AND
        -> user_old.nameusr = user_new.nameusr AND
        -> user_old.rolename = user_new.rolename
        -> UNION
        -> SELECT user_old.*, 'ELIMINADOS' estatus
        -> FROM user_old
        -> WHERE NOT EXISTS ( SELECT * FROM user_new
        ->                    WHERE
        ->                       user_old.oprid = user_new.oprid AND
        ->               user_old.nameusr = user_new.nameusr AND
        ->               user_old.rolename = user_new.rolename)
        -> UNION
        -> SELECT user_new.*, 'AGREGADOS' estatus
        -> FROM user_new
        -> WHERE NOT EXISTS ( SELECT * FROM user_old
        ->                    WHERE
        ->                       user_old.oprid = user_new.oprid AND
        ->               user_old.nameusr = user_new.nameusr AND
        ->               user_old.rolename = user_new.rolename);



    no se si las flechitas antes de cada linea estan bien o no. este codig o lo entiendo un poco y me parece mejor que el anterior
      Votos: -1 - Link respuesta
     
  • Fecha: 03-04-2018 04:29:36 OK basado en la escasa información que aportas sobre tus tablas, te comento que un INNER JOIN no te va a servir, pues solo retornara la data que coincida en la segunda tabla, en caso de no haber coincidencias, este no retornara nada, Salvo que tu estés cargando con el archivo csv la data así el cliente no haya pagado nada.

    Segundo estas utilizando una librería depreciada por ende vas a ten er problemas a futuro con las versiones más recientes de php, debes utilizar mysqli o PDO.

    Tercero, en tu caso se podría utilizar una función auxiliar que se encargue de realizar la búsqueda del pago, si este existe retorna la info, si no lo informa de igual manera, seria algo más o menos así:

    //Esta funcion va a revisar si el cliente realizo el pago o no
    function valida($x){
        $a = $this->db->query("SELECT * FROM tablab WHERE referencia = '$X' ");
        $t = $a->num_rows();
        if($t===1){
            //Si el cliente realizó el pago retorno la información
            $row = $a->fetch_object();
            return $row;
        }else{
            //si no retorno falso
            return false;
        }
    }//
    
    
    $a = $this->db->query("SELECT * FROM tabla");
    $row = $a->fetch->array();
    
    foreach($row as $item){
        //Envío a validar la referencia del cliente
        $valida = valida($item['referencia']);
    
        if($valida){
            //Si existe el pago muestro la información
            echo "El Cliente ".$item['referencia']." Realizo el pago de ".$valida->monto." en fecha ".$valida->fecha;
        }else{
            //Si no existe informo que dicho pago no se ha realizado
            echo "El Cliente ".$item['referencia']." no ha realizado el pago";
        }
    }
    


    Puedes hacer las adaptaciones que requieras en función de los campos a validar, pasar un array a la función con dicha información en caso de requerir una validación mayor.

    Por otro lado imagino que estas manejando como diferenciar un pago de otro, pero en ese caso no puedo ayudarte sin mas detalles de los que aportas.
      Votos: 0 - Link respuesta
     
  • Fecha: 03-04-2018 05:46:25 Aqui te dejo un post que hice muy bien explicado graficamente

    DA CLICK AQUI
      Votos: 1 - Link respuesta
     
  • Fecha: 03-04-2018 06:10:40 perdon por mi poca informacion tratare de corregir mejor eso. tengo por un lado un formulario donde los usuarios introducen informacion referente a un pago el cual es : nombre, fecha,correo,telefono, numero de referencia, y monto. por otro lado subo un archivo del banco a otra tabla de mi misma base de dato con la siguiente informacion. fecha,referencia, monto.
    que quiero hacer?
    quiero comparar ambas tablas y si coinsiden aparesca en una tabla aparte la informacion de todos los usuarios que coinsiden la referencia y monto.
    y que en otra tabla aparescan los usuarios que no coinsidan con la referencia y monto.
    la sintaxis de lo que quiero hacer es comparar registros y obtener resultados de cuales son las coincidencias y cuales no..
    referente a tu codigo esta bien pero me da un error (Fatal error: Using $this when not in object context in C:\xampp\htdocs\superconex\login\prueba.php on line 393)...
     <?php
                            //include('conexion.php');
                            $connect = mysql_connect("localhost","root",""); 
                            mysql_select_db("radius",$connect); //select the table 
    
                            //nombre de mi base de datos: radius
                            //tabla donde los usuarios emiten pagos: pagos_pagina
                            //tabla donde cargo el archivo csv: archivos_pagos
    
                           //Esta funcion va a revisar si el cliente realizo el pago o no
                        function valida($x){
                            $a = $this->db->query("SELECT * FROM pagos_pagina WHERE referencia = '$X' ");
                            $t = $a->num_rows();
                            if($t===1){
                                //Si el cliente realizó el pago retorno la información
                                $row = $a->fetch_object();
                                return $row;
                            }else{
                                //si no retorno falso
                                return false;
                            }
                        }//
                        // esta de aqui abajo seria mi linea 383
                        $a = $this->db->query("SELECT * FROM archivos_pagos");
                        $row = $a->fetch->array();
                        foreach($row as $item){
                            //Envío a validar la referencia del cliente
                            $valida = valida($item['referencia']);
                            if($valida){
                                //Si existe el pago muestro la información
                                echo "El Cliente ".$item['referencia']." Realizo el pago de ".$valida->monto." en fecha ".$valida->fecha;
                            }else{
                                //Si no existe informo que dicho pago no se ha realizado
                                echo "El Cliente ".$item['referencia']." no ha realizado el pago";
                            }
                        }
                        ?>
                       
    


    agradezco mucho tu ayuda
      Votos: 0 - Link respuesta
     
  • Fecha: 03-04-2018 06:27:52 es obvio que te da error, como te dije estas usando una librería depreciada y debes dejar de usarla, mysql esta descontinuada de php, por ende vas a tener problemas con ello, por otro lado, $this hace referencia a una instancia o función de la misma clase o de su pariente para en este caso hacer la conexión con $this->db, por ejemplo:

    //Clase para manejar la conexion a la base de datos
    class Connect
    {
        private $user = "";//usuario de mysqlk
        private $pass = "";//clave de mysql
        private $base = "";//base de datos en mysql
        private $server = "";//servidor de alojamiento
        public $error;//en caso de error se almacena aqui
        public $db;//almacena la instancia de conexion global
    
        public function __construct(){
            $mysqli = new mysqli($this->server, $this->user, $this->pass, $this->base, $this->port);
            if ($mysqli->connect_errno) {
                $this->error = "Fallo al conectar a MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
            }
            $this->db = $mysqli;
        }
    
    }
    
    //Clase trabajo que se extiende de Connect
    class Trabajo extends Connect
    {
        public function __construct(){
    
        }
    
        public function valida($x){
            $a = $this->db->query("SELECT * FROM tablab WHERE referencia = '$X' ");
            $t = $a->num_rows();
            if($t===1){
                //Si el cliente realizó el pago retorno la información
                $row = $a->fetch_object();
                return $row;
            }else{
                //si no retorno falso
                return false;
            }
        }//
    
        public function data(){
            $a = $this->db->query("SELECT * FROM tabla");
            $row = $a->fetch->array();
            foreach($row as $item){
                //Envío a validar la referencia del cliente
                $valida = valida($item['referencia']);
                if($valida){
                    //Si existe el pago muestro la información
                    echo "El Cliente ".$item['referencia']." Realizo el pago de ".$valida->monto." en fecha ".$valida->fecha;
                }else{
                    //Si no existe informo que dicho pago no se ha realizado
                    echo "El Cliente ".$item['referencia']." no ha realizado el pago";
                }
            }
        }
    }
    
    $p = new trabajo();
    
    var_dump($p->data());
    
      Votos: 1 - Link respuesta
     
  • Fecha: 03-04-2018 06:39:07 use este codigo pero tambien me da un error no se si este puede servir haciéndole unas modificaciones
    <?php
                            $connect = mysql_connect("localhost","root",""); 
                            mysql_select_db("radius",$connect); //select the table 
    
                            //nombre de mi base de datos: radius
                            //tabla donde los usuarios emiten pagos: pagos_pagina
                            //tabla donde cargo el archivo csv: archivos_pagos
                            //pagos_pagina
                            //archivos_pagos
                            //selecciono el ID de determinados registros de la tabla01
                            $select_1 = mysql_query("SELECT referencia FROM pagos_pagina WHERE activo = '1'") or die (mysql_error());
                            /*$select_1 = mysql_query("SELECT referencia FROM pagos_pagina WHERE activo = '1'");*/
    
                            //selecciono la columna ID de la tabla02
                            $select_2 = mysql_query("SELECT referencia FROM archivos_pagos");
    
                            //busco las coincidencias
                            //numero que guardara las coincidencias
                            $num = 0;
                            //busco en todos los resultados de select_1
                            while($data = mysql_fetch_array($select_1)){
                            //busco en todos los resultados de select_2
                            while($data2 = mysql_fetch_array($select_2)){
                                if($data['referencia'] == $data2['referencia']){
                                    $num++;
                                }
                            }
                            }
                            if($num >  0){
                            echo "Existen ".$num." coincidencias";
                            }else{
                            echo "No existen coincidencias";}
                       
                        ?>
                       


    me da este error( Unknown column 'activo' in 'where clause')
      Votos: -1 - Link respuesta
     
  • Fecha: 03-04-2018 07:33:53 ok veo que no estas prestando atención a lo que se te ha explicado, ni lo has puesto en práctica, y el error es bastante claro, no existe la columna activo en la tabla, asi que verifica eso, y bueno. Saludos   Votos: 1 - Link respuesta
     
  • Fecha: 03-04-2018 11:43:19 si el ejemplo donde el activo no existe lo modifique y no me da error pero solo me dice que no hay coinsidencias cuando si las hay. y siguiendo y probando lo que me as dicho que pruebe va bien pero me da el siguiente error (Fatal error: Call to a member function query() on null in C:\xampp\htdocs\superconex\login\prueba.php on line 397)

    <?php
    
                        //Clase para manejar la conexion a la base de datos
                        class Connect
                        {
                            private $user = "root";//usuario de mysqlk
                            private $pass = "";//clave de mysql
                            private $base = "radius";//base de datos en mysql
                            private $server = "localhost";//servidor de alojamiento
                            public $error;//en caso de error se almacena aqui
                            public $db;//almacena la instancia de conexion global
                            public function __construct(){
                                $mysqli = new mysqli($this->server, $this->user, $this->pass, $this->base, $this->port);
                                if ($mysqli->connect_errno) {
                                    $this->error = "Fallo al conectar a MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
                                }
                                $this->db = $mysqli;
                            }
                        }
                        //Clase trabajo que se extiende de Connect
                        class Trabajo extends Connect
                        {
                            public function __construct(){
                            }
                            public function valida($x){
                              $a = $this->db->query("SELECT * FROM pagos_pagina WHERE referencia = '$X' ");
                                $t = $a->num_rows();
                                if($t===1){
                                    //Si el cliente realizó el pago retorno la información
                                    $row = $a->fetch_object();
                                    return $row;
                                }else{
                                    //si no retorno falso
                                    return false;
                                }
                            }//
                            public function data(){
    /*esta es mi linea 397*/  $a = $this->db->query("SELECT * FROM archivos_pagos");
                                $row = $a->fetch->array();
                                foreach($row as $item){
                                    //Envío a validar la referencia del cliente
                                    $valida = valida($item['referencia']);
                                    if($valida){
                                        //Si existe el pago muestro la información
                                        echo "El Cliente ".$item['referencia']." Realizo el pago de ".$valida->monto." en fecha ".$valida->fecha;
                                    }else{
                                        //Si no existe informo que dicho pago no se ha realizado
                                        echo "El Cliente ".$item['referencia']." no ha realizado el pago";
                                    }
                                }
                            }
                        }
                        $p = new trabajo();
                        var_dump($p->data());
                        ?>
    

    no se que modificarle para eliminar el error
      Votos: 0 - Link respuesta
     
  • Fecha: 03-04-2018 15:50:23 ok disculpa, es que olvide ejecutar el constructor padre desde el hijo, aqui la nueva muestra modificada:

    //Clase para manejar la conexion a la base de datos
    class Connect
    {
        private $user = "";//usuario de mysqlk
        private $pass = "";//clave de mysql
        private $base = "";//base de datos en mysql
        private $server = "";//servidor de alojamiento
        public $error;//en caso de error se almacena aqui
        public $db;
    
        public function __construct(){
            $mysqli = new mysqli($this->server, $this->user, $this->pass, $this->base);
            if ($mysqli->connect_errno) {
                $this->error = "Fallo al conectar a MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
            }
            $this->db = $mysqli;
        }
    
    }
    
    //Clase trabajo que se extiende de Connect
    class Trabajo extends Connect
    {
        public function __construct(){
            parent::__construct();
        }
    
        public function valida($x){
    
            $a = $this->db->query("SELECT * FROM tablab WHERE referencia = '$X' ");
            $t = $a->num_rows();
            if($t===1){
                //Si el cliente realizó el pago retorno la información
                $row = $a->fetch_object();
                return $row;
            }else{
                //si no retorno falso
                return false;
            }
        }//
    
        public function data(){
    
            $a = $this->db->query("SELECT * FROM direccion");
            $row = $a->fetch_array();
            foreach($row as $item){
                //Envío a validar la referencia del cliente
                $valida = valida($item['referencia']);
                if($valida){
                    //Si existe el pago muestro la información
                    echo "El Cliente ".$item['referencia']." Realizo el pago de ".$valida->monto." en fecha ".$valida->fecha;
                }else{
                    //Si no existe informo que dicho pago no se ha realizado
                    echo "El Cliente ".$item['referencia']." no ha realizado el pago";
                }
            }
        }
    }
    $p = new trabajo();
    var_dump($p->data());
    
      Votos: 0 - Link respuesta
     
  • Fecha: 04-04-2018 04:33:20 exelente pero me da el mismo error que me daba antes (Fatal error: Call to undefined function valida() in C:\xampp\htdocs\superconex\login\prueba.php on line 401) mi linea 401 es (
     $valida = valida($item['referencia']);
    )
      Votos: 0 - Link respuesta
     
  • Fecha: 04-04-2018 05:13:26 brother tienes que aprender e investigar más, pues si uno comete un error de tipeo, debes darte cuenta, eso es porque las funciones estan en una clase y olvide colocar el $this->:

    cambia esto:
    $valida = valida($item['referencia']);
    


    por esto:
    $valida = $this->valida($item['referencia']);
    


    Como te mencioné el secreto es investigar, Prueba de nuevo y avisas
      Votos: 0 - Link respuesta
     
  • Fecha: 04-04-2018 06:04:15 investigue por todos los medios habidos y por haber pero no doy con todos los errores. por ejemplo me salio un error nuevo y fue esto (Notice: Undefined variable: X in C:\xampp\htdocs\superconex\login\prueba.php on line 385) la linea es (
     $a = $this->db->query("SELECT * FROM pagos_pagina WHERE referencia = '$X' ");
    ) y la cambie por
    $a = $this->db->query("SELECT * FROM pagos_pagina WHERE referencia = '$x' ");
    l el error fue poner la x minuscula y despues X mayuscula. perdon por tanta torpedad.
      Votos: 0 - Link respuesta
     
  • Fecha: 04-04-2018 06:05:15 me da el siguiente error (Warning: Illegal string offset 'referencia' in C:\xampp\htdocs\superconex\login\prueba.php on line 402) mi linea 402 es (
     $valida = $this->valida($item['referencia']);
    ) y me da este error (Fatal error: Call to undefined method mysqli_result::num_rows() in C:\xampp\htdocs\superconex\login\prueba.php on line 386) mi linea 386 es (
    $t = $a->num_rows();
    )
      Votos: 0 - Link respuesta
     
  • Fecha: 04-04-2018 06:35:39 ok bro envíame a mi email info.fxstudios gmail.com lo que tienes hecho y la case para ver que estas haciendo y te comento por aquí   Votos: 0 - Link respuesta
     
  • Fecha: 04-04-2018 06:49:58 Hola, Josias.

    Es cierto lo que dice el colega, Carlos; es algo sencillo, pero no estás aportando mucho, si no dominas conceptos de la programación orientada a objetos, es lo que deberías estar aprendiendo para poder comunicarte mejor.

    Te pediría el enlace a tu repositorio en GitHub, aunque no creo que lo tengas en cuenta. Quizá también lo puedas compartir para poder colaborar.

    ¡Saludos cordiales!
      Votos: 1 - Link respuesta
     
  • Fecha: 04-04-2018 11:09:59 Aqui te coloco las modificaciones basado en la informacion que me enviaste sobre tus tablas:

    //Clase para manejar la conexion a la base de datos
    class Connect
    {
        private $user = "";//usuario de mysqlk
        private $pass = "";//clave de mysql
        private $base = "";//base de datos en mysql
        private $server = "";//servidor de alojamiento
        public $error;//en caso de error se almacena aqui
        public $db;
        public function __construct(){
            $mysqli = new mysqli($this->server, $this->user, $this->pass, $this->base);
            if ($mysqli->connect_errno) {
                $this->error = "Fallo al conectar a MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
            }
            $this->db = $mysqli;
        }
    }
    //Clase trabajo que se extiende de Connect
    class Trabajo extends Connect
    {
        public function __construct(){
            parent::__construct();
        }
        public function valida($x){
                $a = $this->db->query("SELECT * FROM archivos_de_pagos WHERE referencia = '$x' ");
                $t = $a->num_rows;
                if($t>=1){
                    //Si el cliente realizó el pago retorno la información
                    $row = $a->fetch_object();
                    return $row;
                }else{
                    //si no retorno falso
                    return false;
                }
        }//
        public function data(){
            $a = $this->db->query("SELECT * FROM pagos_pagina");
            
            echo "<table>
                <thead>
                    <th>Numero</th>
                    <th>Cliente</th>
                    <th>Estatus</th>
                    <th>Referencia</th>
                </thead>
            ";
            $con=1;
            while($row = $a->fetch_object()){
                //Envío a validar la referencia del cliente
                $valida = $this->valida($row->referencia);
                if($valida){
                    echo "<tr>
                            <td>".$con."</td>
                            <td>".$row->nombre." ".$row->apellido."</td>
                            <td>Pago Validado</td>
                            <td>".$valida->referencia."</td>
                        </tr>";
                    }else{
                    echo "<tr>
                            <td>".$con."</td>
                            <td>".$row->nombre." ".$row->apellido."</td>
                            <td>Sin Pago Validado</td>
                            <td>".$row->referencia."</td>
                        </tr>";
                }
                $con++;
            }
            echo "</table>";
        }
    }
    $p = new trabajo();
    $p->data();
    
      Votos: 2 - Link respuesta
     
  • Fecha: 04-04-2018 11:12:13 aunque te recomiendo que coloques un identificador adicional en las validaciones y en tus tablas, por ejemplo, la cédula, esto porque si yo reporto con un numero de referencia igual a alguno que ya este validado, este me va a validar el mio también.   Votos: 1 - Link respuesta
     
  • Fecha: 05-04-2018 11:50:23 gracias muchas gracias carlos por tu ayuda me fue de bien para lo que estoy haciendo seguiré estudiando sobre el tema para ampliarlo a nuevas fronteras muchas gracias .   Votos: 1 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com