| |||
| 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:
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).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 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:
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??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
Alguna pista? MySQL 5 tiene alguna limitación que MySQL 4 no tiene? Cualquier ayuda será apreciada. |
| |||
| 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 11:15 |
| |||
| 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:
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).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
Pongamos por ejemplo:
Código:
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"'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 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! |
| |||
| 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. |
| |||
| 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 |
| |||
| 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. |
| |||
| 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? |