Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Select en 3 tablas

Estas en el tema de Select en 3 tablas en el foro de Mysql en Foros del Web. Hola, tengo un problemilla con un SELECT, tengo unas categorias que quiero traducir por ello tengo estas 3 tablas: Languages: Id, Iso, Name Categories: Id, ...
  #1 (permalink)  
Antiguo 22/11/2012, 10:37
Avatar de Neldor  
Fecha de Ingreso: enero-2010
Mensajes: 52
Antigüedad: 14 años, 3 meses
Puntos: 1
Select en 3 tablas

Hola, tengo un problemilla con un SELECT, tengo unas categorias que quiero traducir por ello tengo estas 3 tablas:

Languages: Id, Iso, Name
Categories: Id, Parent, Name
Categories_lang: Id_lang, Id_category, Name

Lo que necesito es que al seleccionar una categoría me muestre las traducciones de esa categoría, para ello esta consulta parece que serviría:
Código MySQL:
Ver original
  1. FROM Categories AS c
  2.       LEFT JOIN Categories_lang AS cl ON c.Id=cl.Id_category
  3. WHERE c.Id='41'

Pero esta solo me muestra las categorias que ya tienen una traducción insertada y yo quiero que también me muestre si los valores son NULL, algo como:

Código MySQL:
Ver original
  1. -----------------------------------------------------------------
  2. cl.Id_category  |  cl.Id_lang   |  cl.Name  |  c.Name  
  3. -----------------------------------------------------------------
  4. 1               |  1            | NULL      | cat1  
  5. -----------------------------------------------------------------
  6. 1               |  2            | NULL      | cat1  
  7. -----------------------------------------------------------------
  8. 1               |  3            | NULL      | cat1  
  9. -----------------------------------------------------------------

Lo necesito para mostrar un input para poder traducir facilmente, para eso deben salir todos los idiomas aunque no exista el registro en Categories_lang.

Muchas gracias, espero que alguien pueda darme alguna idea interesante.

Última edición por gnzsoloyo; 22/11/2012 a las 11:01 Razón: Conviene poner las consultas estructuradamente, o se van del bloque visible.
  #2 (permalink)  
Antiguo 22/11/2012, 11:01
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Select en 3 tablas

Código MySQL:
Ver original
  1. FROM Categories AS c
  2.           LEFT JOIN Categories_lang AS cl ON c.Id=cl.Id_category
  3. WHERE c.Id='41' OR cl.Id_category IS NULL;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 22/11/2012, 11:39
Avatar de Neldor  
Fecha de Ingreso: enero-2010
Mensajes: 52
Antigüedad: 14 años, 3 meses
Puntos: 1
Respuesta: Select en 3 tablas

Gracias pero no es lo que necesito, este me muestra la categoría que yo quiero y todas las que no tienen una traducción, además que necesito que se muestren todos los idiomas disponibles, en este caso cada registro debería estar 3 veces diferenciando solo el Id_lang
  #4 (permalink)  
Antiguo 22/11/2012, 12:06
Avatar de Neldor  
Fecha de Ingreso: enero-2010
Mensajes: 52
Antigüedad: 14 años, 3 meses
Puntos: 1
Respuesta: Select en 3 tablas

He encontrado la solución:
Código MySQL:
Ver original
  1. , (SELECT Name FROM Categories_lang AS cl WHERE cl.Id_lang = l.Id AND cl.Id_category = c.Id) AS TraName
  2. FROM Categories AS c CROSS JOIN Languages AS l
  3. WHERE c.Id = '41'

Simplemente hace un CROSS JOIN entre categorías y idiomas y le añade el resultado de la subquery con el nombre traducido, no hay que controlar valores NULL ni nada.
  #5 (permalink)  
Antiguo 22/11/2012, 15:20
Avatar de Neldor  
Fecha de Ingreso: enero-2010
Mensajes: 52
Antigüedad: 14 años, 3 meses
Puntos: 1
Respuesta: Select en 3 tablas

Otra opción sin subqueries:

Código MySQL:
Ver original
  1. SELECT * FROM Categories AS c CROSS JOIN Languages AS l
  2. LEFT OUTER JOIN Categories_lang AS cl ON cl.Id_category=c.Id AND cl.Id_lang=l.Id
  3. WHERE c.Id = '8';

Etiquetas: 3tablas, joins
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:22.