Comunidad de diseño web y desarrollo en internet online

INNER JOIN de Sql...sin resultados

Citar            
MensajeEscrito el 30 May 2011 07:40 pm
Hola compañeros, tengo un rollo con el INNER JOIN de Sql...

Mis tres tablas tienen el campo común "product_id":
Tabla: tcategory (campos: product_id / category_id)
Tabla: tdescript (campos: product_id / name / descript)
Tabla: tImg (campos: product_id / image)

Necesito la lista de los campos:
name
descript
image
donde coincidan sus product_id y pertenezcan todos a una
categoría por ejemplo 20.

Mi sentencia es:

Código PHP :

$result = mysql_query("SELECT tcategory.*, tdescript.*, tImg.* 
FROM tcategory 
INNER JOIN (tdescript INNER JOIN tImg ON tImg.product_id = tdescript.product_id) 
ON tdescript.product_id = tcategory.product_id 
WHERE tcategory.category_id = 20;");


Y no me da ningún resultado :?
Vi muchos ejemplos por ahí, pero ninguno funciona...
Pruebo obtener los resultados por separado haciendo una consulta
simple y funciona perfectamente...

Gracias de antemano...

Por DiegoVelevu

50 de clabLevel



Genero:Masculino  

Buenos Aires

chrome
Citar            
MensajeEscrito el 30 May 2011 08:58 pm
¿y por qué un INNER JOIN?, ¿por qué no directamente en el WHERE...

Código MySQL :

SELECT tcategory.*, tdescript.*, tImg.*  
FROM tcategory, tdescript, tImg
WHERE  tcategory.category_id = 20
AND tcategory.product_id = tdescript.product_id
AND tcategory.product_id = tImg.product_id

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 30 May 2011 10:33 pm
Gracias DriverOp, funciona como vos decis...
Pero tengo otro problema ahora.

En una tabla de mi Base de datos hay distintos tipos de columnas:
Campo, tipo, Cotejamiento, Atributos, Nulo, Predeterminado...etc.

Puedo acceder a todos los datos de todos los campos salvo uno,
justo el que necesito, y, buscando diferencias en la lista de columnas
me encuentro conque uno, "image" puede ser nulo, los demás no.



En los resultados, aparece toda la lista:


Pero en mi consulta a través de PHP ése campo sale vacío :?

Código PHP :

while($row = mysql_fetch_assoc($result)){ 
     echo "PRODUCTO ID: "  . $row['product_id'] . "<br />";
     echo "Name: "         . $row['name'] . "<br />";
     echo "Categorie: "    . $row['category_id'] . "<br />";
     echo "IMAGE: <"       . $row['image'] . " > <br />"; // <b>RESULTADO EN BLANCO...</b>
     echo "Date: <"       . $row['date_added'] . " > <br />"; // 
     echo "Description: "  . html_entity_decode($row['description']); 
}


Puedo sacar cualquier otro campo, menos el de 'image', y veo que es
el único que puede tener un valor Null (porque podría no tener una imagen;
que no es mi caso, porque sí tengo imágenes en todas las filas).
Desde ya, se trata de un OpenCart y no lo puedo cambiar porque se va todo
al diablo :lol:
Si alguien sabe qué puede ser...
Gracias...

Por DiegoVelevu

50 de clabLevel



Genero:Masculino  

Buenos Aires

chrome
Citar            
MensajeEscrito el 30 May 2011 10:41 pm
En fin, nunca solucioné algo tan, pero tan rápido...

En mi PHP dice:

Código PHP :

echo "IMAGE: <"       . $row['image'] . " > <br />";
y los signos < y > NO VAN!!!
echo "IMAGE: "       . $row['image'] . "<br />";


Y ya que estoy aprovecho para aclarar una pregunta que hice en otro post:
¿Cómo hacer para que PHP devuelva en html una respuesta que en la base de
datos está grabada como tal, es decir, con <ul><li></li></ul>, font= etc, etc, etc?

Solución:

Código PHP :

echo "Description: "  . html_entity_decode($row['description']);


HTML_entity_decode decodifica y lee todo como html....

Por DiegoVelevu

50 de clabLevel



Genero:Masculino  

Buenos Aires

chrome
Citar            
MensajeEscrito el 30 May 2011 10:46 pm
DriverOp si se trata de unir tablas lo correcto es usar JOIN,LEFT o INNER dependiendo del caso, asi tienes control sobre que dejas dentro y que dejas fuera

la consulta la veo algo complicada y dificil de leer

la tienes asi:

Código PHP :

 
$result = mysql_query("SELECT tcategory.*, tdescript.*, tImg.*  
FROM tcategory  
INNER JOIN (tdescript INNER JOIN tImg ON tImg.product_id = tdescript.product_id)  
ON tdescript.product_id = tcategory.product_id  
WHERE tcategory.category_id = 20;");


pero es mas facil leer asi

Código PHP :

 
$sql = "
SELECT
    tcategory.*,
    tdescript.*,
    tImg.*  
FROM tcategory  
    INNER JOIN
    (
   tdescript INNER JOIN tImg ON tImg.product_id = tdescript.product_id
    )
    ON tdescript.product_id = tcategory.product_id  
WHERE tcategory.category_id = 20;";
$result = mysql_query($sql);


ahora nos centraremos en tu problema real que es unicamente la consulta

Código MySQL :

SELECT
    c.name,
    d.descript,
    i.image
    -- tcategory.*, esto esta MAL en un ambiente de producción
    -- tdescript.*,
    -- tImg.*  
FROM tcategory c
INNER JOIN tdescript d ON d.product_id = c.product_id
INNER JOIN tImg i ON i.product_id = c.product_id
WHERE c.category_id = 20;


tengo un tutorial de consultas cruzadas que debieras leer, también lee los comentarios pues tienes algunos errores http://www.cristalab.com/tutoriales/consulta-sql-a-mas-de-dos-tablas-con-join-c77632l/

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

firefox
Citar            
MensajeEscrito el 31 May 2011 12:21 pm

Inyaka escribió:

DriverOp si se trata de unir tablas lo correcto es usar JOIN,LEFT o INNER dependiendo del caso, asi tienes control sobre que dejas dentro y que dejas fuera

Cierto. Pero DiegoVelevu no ha dicho que quiera dejar algo adentro o afuera.
A preguntas generales, respuestas generales ;).

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 31 May 2011 10:42 pm
Excelente Inyaka! Leí tu post.

Ahora bien, funciona así como tú dices, pero ¿qué pasa si quisiera
sacar más de un dato de alguna de las tablas? Por ejemplo en tdescript,
de donde saco la descripción del producto también puedo necesitar usar
otras columnas como date, model, precio, etc...
Intenté esto, pero no funcionó...

Código PHP :

$result = mysql_query("
SELECT 
c.category_id, 
d.description, 
e.model, 
-- (e es la misma tabla que d y en otro contexto 
-- podría  necesitar añadir otros campos)
i.image  
   
FROM tcategory  c 
INNER JOIN tdescript d ON d.product_id = c.product_id 
           AND tdescript e ON e.product_id = c.product_id (sin esta línea funciona)
     
INNER JOIN tImg i ON i.product_id = c.product_id 
WHERE c.category_id = 20;");


No podría hacer otro INNER JOIN porque no se trata de otra tabla, sino
de la misma... :roll:

Busqué info sobre consultas múltiples y aquí estoy... :lol:

Gracias!

Por DiegoVelevu

50 de clabLevel



Genero:Masculino  

Buenos Aires

chrome
Citar            
MensajeEscrito el 31 May 2011 10:51 pm

Código MySQL :

SELECT
e.campo 1,
e.campo 2,
e.campo 3
FROM esatabla e 
-- ETC... 

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

firefox
Citar            
MensajeEscrito el 01 Jun 2011 03:24 pm
En fin, por si a alguien le sirve trataré de explicar.

Código PHP :

$tDescript = "opnproduct_description";      
$tCat      = "opnproduct_to_category";   
$tProduct  = "opnproduct";

$result = mysql_query("
SELECT 
c.category_id, 
d.description, 
d.name, 
i.image, 
i.model  

FROM $tCat c

/*Acá se unen las tres tablas, especificando UNICAMENTE
qué campos deben coincidir*/
INNER JOIN $tDescript d ON d.product_id = c.product_id
INNER JOIN $tProduct i ON i.product_id = c.product_id

WHERE c.category_id =20

LIMIT $start, $limit;");


Donde $tDescript tiene tres campos:
product_id (que coincidirá o no con las otras dos tablas)
description
name
Y $tProduct tiene otros tres
product_id (que coincidirá o no con las otras dos tablas)
image
model

El Resultado de este query es:
de $tCat: category_id /
de $tDescript : description / name /
y de $tProduct : image / model

[o sea, la lista que sigue a SELECT]

Genial el recurso!!!

Por DiegoVelevu

50 de clabLevel



Genero:Masculino  

Buenos Aires

chrome
Citar            
MensajeEscrito el 01 Jun 2011 05:13 pm
veo que leiste el tutorial XD

por cierto algunas veces si se hacen varios join a una misma tabla, por ejemplo imagina que tengo una tabla con los valores de ciertas clabes, osea, solo el diccionario de que significan ciertos datos, en ese caso puedes hacer varios join a la misma tabla, solo que le pondras alias distintos ;)

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.