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

Problema de compatibilidad JOINS MySQL4 - MySQL5?

Estas en el tema de Problema de compatibilidad JOINS MySQL4 - MySQL5? en el foro de Mysql en Foros del Web. Buenas... Tengo un problema con una query con joins que me está comiendo. Lo curioso del caso es que la hice en local contra MySQL ...
  #1 (permalink)  
Antiguo 08/04/2008, 04:02
 
Fecha de Ingreso: octubre-2007
Mensajes: 5
Antigüedad: 16 años, 6 meses
Puntos: 0
Pregunta Problema de compatibilidad JOINS MySQL4 - MySQL5?

Buenas...

Tengo un problema con una query con joins que me está comiendo. Lo curioso del caso es que la hice en local contra MySQL 4 y funciona bién, pero al pasarla al servidor de producción (MySQL 5) simplemente no devuelve resultados.

La consulta trabaja contra 3 tablas, formando la típica relación N:M (1-N : N-1)

variables
---------
id (pk)
name

var_questions
-------------
id (pk)
id_variable (fk)
id_language (fk)
question

languages
----------
id (pk)
name

Está en tablas MyISAM (es decir, pongo FK pero realmente no hay relaciones establecidas ;) ).

La query que funciona en MySQL 4 y no en MySQL 5 es esta:

Código:
select
	  variables.name			as var_name,
	  variables.id				as var_id,
	  var_questions.question	as question,
	  languages.name			as lang
	from
	  variables
	    left join var_questions on variables.id = var_questions.id_variable
	      right join languages on var_questions.id_language = languages.id
	where
	    var_questions.question is null
	and languages.enabled = 1
La query debería extraer las variables que tienen var_questions que sean nulos en ciertos lenguages activos, es decir, teniendo una lista de variables y una lista de lenguages activos, necesito info de variables que les falte establecer var_questions en algun lenguage (y en cuál).

Un set de resultados correctos sería algo así:

var_name var_id question lang
var_1 56 null ca
var_2 60 null ca
var_3 65 null ca

Con que tengo que éstas 3 variables les falta la var_question para el lenguage "ca".

Pero la query ejecutada sobre MySQL 5 con una base de datos idéntica me devuelve 0 resultados. Me he dado cuenta que el problema está en acumular muchos joins (tengo otras querys que me pasa lo mismo).
La única forma de conseguir los mismos valores, almenos con los mismos datos, es haciendo una query así:

Código:
select
	  variables.name			as var_name,
	  variables.id				as var_id,
	  var_questions.question	as question,
	  languages.name			as lang
	from
    languages
      cross join variables
        left join var_questions on var_questions.id_language = languages.id
	where
	    var_questions.question is null
	and languages.enabled = 1
Pero no me fío... no conozco muy bién qué hace el cross join y por lógica la primera la encuentro más entendible. Porqué no funciona??

Alguna pista? MySQL 5 tiene alguna limitación que MySQL 4 no tiene?

Cualquier ayuda será apreciada.
  #2 (permalink)  
Antiguo 08/04/2008, 09:42
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Re: Problema de compatibilidad JOINS MySQL4 - MySQL5?

Dracco,
creo que tu problema es un uso no apropiado de left join, right join, etc. Cross Join es igual a Inner Join y es, en tu caso, según creo, lo apropiado. Me explicaré:
piensa que el campo donde tienes NULL es question, y que ese campo no está relacionado directamente con ningún otro, sino que la relación se establece por id_language e imagino que el id_language (fk) de var_questions no aparece nunca como nulo, sino que tendrá el número correspondiente al id (pk) de language.
Si eso es así, tu consulta para una MySqL 4 ó 5 deberá ser esta
select
variables.name as var_name,
variables.id as var_id,
var_questions.question as question,
languages.name as lang
from
variables
inner join var_questions on variables.id = var_questions.id_variable
inner join languages on var_questions.id_language = languages.id
where
var_questions.question is null and languages.enabled = 1

Creo que funcionará en ambas. Cosa distinta es que dejaras como null ó 0 los id pk o fk de cualquiera de las tablas; entonces, según creo, sí tendrías que utilizar left join o right join, según el caso.
Pruébalo y cuéntanos.

Suerte

Última edición por jurena; 08/04/2008 a las 10:15
  #3 (permalink)  
Antiguo 09/04/2008, 01:42
 
Fecha de Ingreso: octubre-2007
Mensajes: 5
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: Problema de compatibilidad JOINS MySQL4 - MySQL5?

Antetodo, gracias jurena por contestar a mi problema.

A ver, la intención de la query no es sacar resultados. La query está para encontrar inconsistencias que se hayan podido colar. Estamos en una fase de desarrollo y antes de realizar un proceso más importante debo asegurarme que todo está en su sitio.

Si utilizo la query que me propones:

Código:
select
  variables.name as var_name,
  variables.id as var_id,
  var_questions.question as question,
  languages.name as lang
from
  variables
    inner join var_questions on variables.id = var_questions.id_variable
    inner join languages on var_questions.id_language = languages.id
where
    var_questions.question is null
and languages.enabled = 1
Saco todos los resultados coincidentes, pero si no tengo algún registro en la tabla var_questions que ligue una variable con un idioma, no me va a aparecer (probado: no saca resultados).

Pongamos por ejemplo:

Código:
variables
--------------------
id    name
56     var_1
60     var_2
61     var_3

languages
------------------
id  name enabled
2     es      1
4     ca      1
5     en      0

var_questions
------------------
id  id_variable  id_ language  question
1    56                 2                   Variable 1 castellano  
2    60                 2                   Variable 2 castellano
3    61                 2                   Variable 3 castellano
Como ves, hay un idioma 'ca' que está activo pero que no tiene ningún registro en var_questions que lo relacione con ninguna variable. Entonces yo quiero justamente una query que me diga 'var_1, var_2 y var_3 les falta el lenguage "ca"'

Acepto que la query que tengo (ver primer mensaje) no sea la mejor (acepto ideas), pero el problema es que en MySQL 4 funciona y en MySQL 5 no (sin devolver ningún error, simplemente rows 0).

Por favor, alguna ayuda!
  #4 (permalink)  
Antiguo 09/04/2008, 02:25
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Re: Problema de compatibilidad JOINS MySQL4 - MySQL5?

dracco,

Ahora te he entendido, pues pensé que sólo buscabas los null.
Si lo que buscas son inconsistencias, naturalmente lo que menos te sirve es el INNER JOIN, y tendrás que recurrir a LEFT OUTER JOIN y RIGHT OUTER JOIN. Ahora no puedo mirarte nada, pero si no recibes respuestas, intentaré hacerte otra propuesta de solución.
  #5 (permalink)  
Antiguo 09/04/2008, 04:02
 
Fecha de Ingreso: octubre-2007
Mensajes: 5
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: Problema de compatibilidad JOINS MySQL4 - MySQL5?

Gracias jurena.

De hecho, busco los null para encontrar las inconsistencias. Lo gracioso (otra vez) es que usando la lógica construí la primera query que lo bordaba, pero al pasarlo a MySQL 5 es cuando da problemas. Por éso lo enfoco como problema en MySQL y no como diseño de la propia query.

Como comenté, de momento lo soluciono con el CROSS JOIN, pero no me parece una buena forma de tratarlo.

Gracias otra vez por tu tiempo.

Salu10
  #6 (permalink)  
Antiguo 09/04/2008, 07:41
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Re: Problema de compatibilidad JOINS MySQL4 - MySQL5?

Dracco,

he probado tu consulta primera en MySQL 5.0.27-community-nt, mi versión, lanzándola desde PHPMyAdmin, y funciona perfectamente, ofreciéndome los resultados esperados.
Sin embargo, la segunda consulta que tú dices que te funciona me ofrece los resultados distorsionados.

Eso es lo que puedo decirte.
  #7 (permalink)  
Antiguo 10/04/2008, 07:17
 
Fecha de Ingreso: octubre-2007
Mensajes: 5
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: Problema de compatibilidad JOINS MySQL4 - MySQL5?

Pues las versiones exactas que puedo dar son las siguientes:

Servidor dónde la primera query funciona perfectamente:
MySQL 4.1.22-community-nt sobre Windows Vista

Servidor dónde la primera query simplemente devuelve 0 rows:
MySQL 5.0.24a sobre Linux 2.6.9-023stab046.2-enterprise (Red Hat 3.4.5-2)

Alguna idea más? Alguien puede probar la query en su servidor?
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 21:19.