php mysql unirse a 3 tablas

Estoy navegando a través de un sistema de comentarios de tipo retroalimentación en una página de usuario, encontrando las últimas 6 publicaciones.

Para mostrar la publicación como quiero, tengo que tomar datos de 3 tablas.

Supongo que sería menos intensivo en db si todo se extrajera en una consulta, pero no estoy seguro de cómo escribirlo, siendo una mierda en JOINs y cosas así.

Este es mi código existente

$sql_result = mysql_query("SELECT * FROM feedback WHERE user='1' ORDER BY date desc LIMIT 6", $db);
while($rs = mysql_fetch_array($sql_result)) {

   $sql_result2 = mysql_query("SELECT * FROM members WHERE id= '$rs[author]'", $db); 
   $rs2 = mysql_fetch_array($sql_result2);

   if ($rs2[clan] != 0) { 
      $sql_result3 = mysql_query("SELECT * FROM clans WHERE id= '$rs2[clan]' LIMIT 1", $db);
      $rs3 = mysql_fetch_array($sql_result3);

     // write comment

¿Alguien puede darme una pista?

preguntado el 08 de noviembre de 11 a las 19:11

¿Existe una relación entre los datos de esas tablas? Si es así, ¿qué es? -

Es una mala práctica tener tantas consultas dentro de tantos bucles. -

Solo una nota, usando claves de matriz sin comillas como $rs2[clan] está confiando en PHP para malinterpretarlos como cadenas en lugar de constantes. Realmente debería hacer referencia a esas variables como {$rs['clan']}, citado y incluido en {} dentro de la cadena entre comillas dobles. -

2 Respuestas

Esto debería hacerlo:

select * from feedback 
left join members on feedback.author = members.id 
left join clans on members.clan = clans.id
where feedback.user = 1

unión izquierda significa que si la tabla de la derecha no tiene una fila coincidente, se devuelve un registro con todos los valores nulos, por lo que aún obtiene los datos de la tabla de la izquierda.

respondido 08 nov., 11:23

Yo mismo no soy un experto en Sql, pero he aprendido algunos trucos aquí y allá :-)

Un LEFT JOIN típico que funciona en Firebird es:

select A.*,B.*,C.*
from FEEDBACK A left join MEMBERS B
on A.USER = B.ID left join CLANS C
ON C.ID = A.USER
where A.USER=1

La lógica detrás de la combinación es que todas las filas que ahora comparten el mismo valor, A.USER = B.ID = C.ID ahora serán visibles. Las letras AB y C se usan solo por simplicidad. F, M y C funcionarán de la misma manera.

Esta unión izquierda seleccionará todas y cada una de las columnas de las tablas. Esto se hace con A.*,B.*,C.* Tal vez desee solo unas pocas columnas en cada tabla. Eso se puede lograr nombrando las columnas de la misma manera. Ejemplo:

A.USER,A.FIRSTNAME,A.SURNAME,B.COLNAME1,B.COLNAME2,C.COLNAME1,C.COLNAME2

Cuando necesite dirigir las columnas más adelante, recuerde el Prefijo de A. o B. o C. antes del nombre real de la columna a la que se dirige.

Buena suerte y saludos cordiales. Morten, Noruega

respondido 09 nov., 11:00

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.