entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Consulta de padre a hijo

Hola a todos necesito ayuda tengo una consulta de padre a hijo en una tabla, la cual tiene ID, NOMBRE, PREDECESOR. Y en un formulario tengo que ir escribiendo en un input mientras en un combo se me van cargando los padres y este llena los otros datos me gustaria saber en que estoy fallando en esta consulta

SELECT 
      PADRE.id_unico,                        
      PADRE.codi_presupuesto,
      PADRE.nombre
FROM
      gf_rubro_pptal PADRE
LEFT JOIN   
      gf_rubro_pptal HIJO
ON
      PADRE.id_unico = HIJO.id_unico
WHERE 
     (HIJO.codi_presupuesto NOT LIKE '$codi') 

este es mi archivo el cual la recibe por post
mi archivo de consulta


<?php 
    #Archivo de consulta y retornado de valores
    require_once 'Conexion/conexion.php';
    #iniciamos la sesión
    session_start();    
    #validación de dato no nulo ni vació
    if (!empty($_POST["code"]) || !isset($_POST["code"])) {
        #Definimos la variable $code con el valor enviado
        $codi = (string) $_POST["code"];

        #consulta en la que verificamos la existencia del codigo y buscamos sus similares
    $sql = "SELECT 
                        PADRE.id_unico,                        
                        PADRE.codi_presupuesto,
                        PADRE.nombre
                FROM
                        gf_rubro_pptal PADRE
                LEFT JOIN   
                        gf_rubro_pptal HIJO
                ON
                        PADRE.id_unico = HIJO.id_unico
                WHERE 
                        (HIJO.codi_presupuesto NOT LIKE '$codi')  ";
        #Cargamos los resultados en la consulta en la variable
        $resultado = $mysqli->query($sql);
        #Definimos a filas como a un contador de filas
    $filas =  mysqli_num_rows($resultado);
        #Validamos si existen filas por medio de la variable filas la cual debe retornar un valor diferente de 
        #cero para indicar que exsiten filas
        while ($row = mysqli_fetch_row($resultado)) {            
            echo '<option value="'.$row[0].'">'.$row[1] .'-'. ucwords(utf8_encode(strtolower($row[2]))) .'</option>';
        }

    }
 ?>

ante mano agradezco su atención y ayuda

2votos

Leonardo-Tadei comentado

Hola @Jhon_Numpaque,

editá tuj pregunta y agrega por favor la estructura de la tabla y 4 o 5 datos de ejemplo, para que podamos entender la semántica del problema.

Creo que el amigo @magarzon está bien orientado a la solución, pero nos hará falta la confirmación de la estructura y datos de la tabla, para no tener que suponer tantas cosas.

Saludos cordiales

0voto

Alex_Numpaque comentado

Esta bien @Leonardo-Tadei la estructura es
de la tabla es

Campo - Tipo
Id_Unico - int(11)
CodigoPresupuesto - varchar(20)
Predecesor - int(11)

1 Respuesta

5votos

magarzon Puntos30650

Buenas.

Aunque tu código es un poco confuso (aprovecho para recomendar a todos que procuren utilizar PSR-2, sería más fácil de leer el código), tienes al menos dos errores, según lo que puedo llegar a entender.

El primero en principio no te saltaría nunca, porque entiendo que a este php se le llama siempre que cambies algo en el input y por tanto el campo "code" siempre va informado, ya que tienes esto:

if (!empty($_POST["code"]) || !isset($_POST["code"]))

Y la primera condición se cumple porque siempre envías algo, pero si llamas a este php sin enviar nada, te va a pegar un error porque cumpliría la segunda condición (el !isset) y luego fallaría al intentar acceder a un índice no existente. Quita el ! en el isset.

Pero vamos a lo importante. Entiendo que lo quieres hacer es que en el input metes un código relacionado con el hijo (¿código de presupuesto?) y mostrar los padres que tienen un hijo con un código similar, por ejemplo si meto 1234, mostrar los padres que tienen un hijo con códigos de presupuesto 12345, 123456, etc.

El primer fallo de la query es que estás haciendo el join sobre los ids de cada tabla, cuando debería ser sobre los campos que relacionan una tabla con la otra (por cierto, lo de llamar id_unico a esos campos es un poco redundante, no?). Es decir, que seguramente en la tabla HIJO tendrás un campo id_padre o similar, que contiene el id del padre. Entonces el join debería ser así:

SELECT PADRE.id_unico,PADRE.codi_presupuesto,PADRE.nombre FROM gf_rubro_pptal PADRE LEFT JOIN gf_rubro_pptal HIJO ON PADRE.id_unico = HIJO.id_padre

Por otro lado, si lo que quieres es, como decía, obtener los padres cuyos hijos tienen un código similar al introducido, el where debería ser sin el NOT, quedando la cosa:

$sql = "SELECT 
                    PADRE.id_unico,                        
                    PADRE.codi_presupuesto,
                    PADRE.nombre
            FROM
                    gf_rubro_pptal PADRE
            LEFT JOIN   
                    gf_rubro_pptal HIJO
            ON
                    PADRE.id_unico = HIJO.id_padre
            WHERE 
                    (HIJO.codi_presupuesto LIKE '$codi%')  ";

Espero haber entendido bien el problema y que esta sea la solución, si no, ya sabes, aclara un poco más.

Saludos.

Actualización: Dado que el argumento para el like es una especie de expresión regular, he metido un % al final para que encuentre todos los que empiecen por $codi, si no solo encontraría los que son exactamente igual a $codi.

0voto

Alex_Numpaque comentado

@magarzon gracias enserio gracias

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta