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

Leonardo-Tadei comentado Agosto 16, 2016

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

Alex_Numpaque comentado Agosto 17, 2016

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 Puntos13880

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.

Alex_Numpaque comentado Agosto 17, 2016

@magarzon gracias enserio gracias

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

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Actividad Reciente

  • steven ganó una medalla hace 10 horas

    Veterano - Primera visita hace más de 180 días
  • leog.1992 ganó una medalla hace 1 día

    Renovador - Received Buena Respuesta badge in resp…
  • leog.1992 ganó una medalla hace 1 día

    Medallista - Received total of 10 badges
  • leog.1992 ganó una medalla hace 1 día

    Buena Respuesta - Recibido +1 votos en respuesta
  • sagrario ganó una medalla hace 1 día

    Buena Pregunta - Recibido +1 votos en pregunta
  • leog.1992 respondió hace 1 día

    ticket en java con mysql
  • leog.1992 ganó una medalla hace 1 día

    Antepasado - Primera visita hace más de 365 días
  • leog.1992 ganó una medalla hace 1 día

    Veterano - Primera visita hace más de 180 días
  • Leonardo-Tadei ganó una medalla hace 2 días

    Buena Respuesta - Recibido +1 votos en respuesta
  • nico140 ganó una medalla hace 3 días

    Buena Pregunta - Recibido +1 votos en pregunta

¿Eres Usuario Apple?

...

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

Conecta