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

Unir fila a consulta SELECT (concatenar) ?

Hola, saludos.

Empezaré explicando que tengo éstas 3 tablas:
3 tablas

En mi pagina principal imprimo los datos de la tabla noticia(titulo,fecha,anotaciones) de la siguiente forma:

 include("conexion.php");

    $sql = "SELECT  *from noticia order by fecha DESC; //Creamos la select
    $query=$con->prepare($sql); //para evitar injection sql
    $query->execute();

    $model=array();

    while($rows=$query->fetch()){
       $model[]=$rows;
    }

Aclaro que me conecto a mi base de datos mediante PDO.
Pues bien, seguido muestro mis datos de la siguiente forma:

 foreach ($model as $row ) {

        echo " <div class='col-md-10'>
            <article class='white-panel'>
              <div class='row'>     
                 <div class='col-md-10'>
                   <h4><u>".$row['titulo']."</u></h4>
                   <span>Fecha publicacion: ".$row['fecha']."</span>

                 </div>
                 <div class='col-md-10'>
                   <a href='#'>  <input type:'button' class='btn btn-xs btn-primary' value='Leer más...'></a>
                 </div> 
              </div>
            </article>
          </div>";
          # code...
        }

Ahora obtengo mi resultado algo asi:
enter image description here

Ahora lo que ocurre es que adicional quiero mostrar el nombre del BARRIO para cada NOTICIA y estás tablas se relacionan como ya pueden ustedes ver, mi problema es que nose como deberia hacer el select para incluir la fila nombre de BARRIO e imprimirlo en el foreach

Si tienes alguna idea por favor házmela saber :) .

0voto

GusGarsaky comentado

Intenta:

SELECT titulo, fecha, barrio FROM noticia, barrio
WHERE id_noticia = barrio.id_noticia;

Disculpa que las columnas no concuerden con tu tabla, es que no veo las imágenes que has puesto.

0voto

Dr oscar comentado

No funcionaria de ningún modo así, porque son 3 tablas y debo desde la tabla NOTICIA relacionarme con la tabla JUNTA para obtener el dato "nombre" de la tabla "BARRIO".
y la llave principal de NOTICIA es un int autoincremetable.

0voto

GusGarsaky comentado

Trata de poner mejor las imágenes porque no se ve nada. Asumo que tienes una tabla para noticias, otra para los barrios y otra que almacena la noticia con los barrios asociados a ella. Entonces, podrías hacer algo como:

Select n.titulo, n.fecha, b.nombre FROM Noticia n, Barrio b
WHERE n.id AND b.id IN
(SELECT * FROM Noticia_Barrio);

No recuerdo bien las restricciones para las subconsultas, pero intenta.

0voto

Dr oscar comentado

Pero a mi si me aparecen las imagenes, nose porque no le aparecen.

y estaba intentando hacer la consulta asi:

SELECT n.numero,n.titulo,n.fecha,b.nombre from noticia n,barrio b where n.cod_Junta=(SELECT j.cod_Junta from junta j,barrio b where j.cod_Barrio=b.cod_Barrio)order by n.fecha DESC

Pero me aparece el error:

#1242 - Subquery returns more than 1 row

0voto

GusGarsaky comentado

Claro, porque tu subconsulta devuelve una lista de registros y tú estás comparando esa lista de registros con n.cod_Junta que es una sola columna.

Intenta esta consulta:

SELECT n.numero, n.titulo, n.fecha, b.nombre FROM noticia n, barrio b
WHERE n.cod_Junta IN
(SELECT j.cod_Junta FROM Junta j AND j.cod_Barrio = b.cod_Barrio);

1voto

Dr oscar comentado

Perfecto :D . Ahora si me funciona. Escribela como respuesta para marcarla como respondida :) .

0voto

Peter comentado

Hay 3 imágenes entre tu pregunta y tus comentarios que no cargan. "403 - Forbidden".

Si puedes corregir los permisos de donde las alojas bien. Si no, mejor las quitamos para que no este haciendo llamadas sin resultado.

Saludos.

1voto

Dr oscar comentado

Creo que ya. Avísame si ahora si se visualizan.

0voto

Peter comentado

Ahora si :D Gracias.

2 Respuestas

2votos

Leonardo-Tadei Puntos227320

Hola @Dr oscar,

la consulta que estás buscando es la siguiente:

SELECT NOTICIA.*, BARRIO.nombre
FROM (NOTICIA, JUNTA, BARRIO)
WHERE NOTICIA.cod_Junta=JUNTA.cod_Junta
AND JUNTA.cod_Barrio=BARRIO.cod_Barrio
ORDER BY NOTICIA.fecha DESC;

Puse los nombres de las tablas en mayúsculas porque así está en la imagen, pero tal vez tengas que cambiarlo a minúculas si tus tablas están así.

Lo que hace esto es relacionar la tabla NOTICIA con JUNTA, y a JUNTA con BARRIO, para encadenar las relaciones y poder obtener el nombre del barrio.

Saludos!

PD: la consulta sería mucho más eficiente si los códigos fueran todos enteros en vez de var_char.
Creá además un índice por cada código para ganar performance.

1voto

Dr oscar comentado

Gracias por responder, el método no lo conocia.

Y disculpas con Gus Garsaky, su metodo funcionaba pero no al momento de ordenar, ó eso creo.

Gracias de igual forma a ambos por atender :D .

1voto

GusGarsaky comentado

No pasa nada, no terminé de comprender bien tu problema porque no vi las estructuras de las tablas (por alguna razón no veo las imágenes). Que bueno que lo hayas resuelto. Salu2.

1voto

GusGarsaky Puntos5480

La consulta sería así:

SELECT n.numero, n.titulo, n.fecha, b.nombre FROM noticia n, barrio b
WHERE n.cod_Junta IN
(SELECT cod_Junta FROM Junta);

0voto

Dr oscar comentado

Ah pero ésta es distinta, no funciona :/ . Aparece el error:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'AND j.cod_Barrio = b.cod_Barrio) LIMIT 0, 30' at line 3

0voto

Dr oscar comentado

Antes me habia funcionado con ésta:

SELECT n.numero, n.titulo, n.fecha, b.nombre FROM noticia n, barrio b
WHERE n.cod_Junta IN
(SELECT cod_Junta FROM junta)

0voto

Dr oscar comentado

Ahora tengo un problema porque debo mostrarlos en orden segun la fecha NOTICIA y me aparece utilizando éste :

SELECT n.numero, n.titulo, n.fecha, b.nombre FROM noticia n, barrio b
WHERE n.cod_Junta IN
(SELECT cod_Junta FROM junta) order by n.fecha DESC

Pero me muestra una fila para cada nombre de barrio y solo debe aparecer la noticia y el barrio correspondiente:
imagen

1voto

blaDDI comentado

   SELECT a.nombre,c.fecha,c.asistencia,c.anotaciones 
     FROM barrio a
LEFT JOIN junta b ON(b.cod_Barrio=a.cod_Barrio)
LEFT JOIN noticia c ON(c.cod_Junta=b.cod_Junta) 
 ORDER BY c.fecha DESC

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