Retroceder   Foros del Web > Programación para sitios web > Bases de Datos > Mysql

Respuesta
 
Herramientas Desplegado
Antiguo 20-mar-2008, 14:40   #1 (permalink)
qvixote ha deshabilitado el karma
 
Avatar de qvixote
 
Fecha de Ingreso: marzo-2008
Mensajes: 27
¿Alguien me puede decir qué está mal en esta consulta?

Les cuento que en mi trabajo (un colegio) hace tiempo se instaló Claroline 1.7.0 y sobre él se comenzó a desarrollar otros módulos que tienen que ver con la gestión del colegio más que con el trabajo en sala (Claroline es una plataforma de aprendizaje a distancia).

El problema comienza cuando nos falla el servidor y armamos otro nuevo, pero este con PHP5 a diferencia del anterior que tenía PHP4. También actualizamos las versiones de MySQL, pero en este momento no podría poner las versiones.

Bueno, el resultado fue que algunas partes de claroline dejaron de funcionar, y buscando y buscando me tenido que hacer algunas modificaciones en las consultas, más que nada cambios de orden, y han funcionado, pero hay una consulta que me está haciendo la vida imposible y no puedo entender por qué MySQL me dice que está mal.

La consulta es la siguiente:

Código:
SELECT `U`.`user_id` AS `authId`,
  CONCAT(`U`.`nom`, ' ', `U`.`prenom`) AS `name`,
  COUNT(`S`.`id`) AS `submissionCount`,
  `S`.`title`,
  MIN(`S`.`creation_date`)

FROM `AcaDB`.`user` as `U`,
  `AcaDB`.`cours_user` as `CU`

LEFT JOIN `No2008287`.`wrk_submission` AS `S` ON `S`.`user_id` = `U`.`user_id`
  AND ( `S`.`assignment_id` = 1 OR `S`.`assignment_id` IS NULL )
  AND `S`.`original_id` IS NULL WHERE `U`.`user_id` = `CU`.`user_id`
  AND `CU`.`code_cours` = '2008287'

GROUP BY `U`.`user_id`

ORDER BY `CU`.`statut` ASC, `CU`.`tutor` DESC, `U`.`nom` ASC, `U`.`prenom` ASC

Y el error que me da es el siguiente:

Código:
#1054 - Unknown column 'U.user_id' in 'on clause'
Como si la columna no existiera, pero si existe. La estructura de la tabla que se supone da el conflicto es la siguiente:

Código:
	user_id  	int(11)
	nom 	varchar(60) 	
	prenom 	varchar(60) 
	username 	varchar(20) 	
	password 	varchar(50) 	
	authSource 	varchar(50) 	
	email 	varchar(100) 	
	statut 	tinyint(4) 		
	vida 	tinyint(4) 	
	officialCode 	varchar(40) 	
	phoneNumber 	varchar(30) 	
	pictureUri 	varchar(250) 
	creatorId 	int(11) 	
	dir 	varchar(255)
	maildir 	varchar(255)

¿Alguien me podría decir qué es lo que está mal en esa consulta? Porque en el otro servidor funcionaba sin problemas, pero acá no.

Me despido agradeciendo de antemano cualquier ayuda que puedan prestarme.
qvixote está desconectado   Responder Citando
Antiguo 20-mar-2008, 19:24   #2 (permalink)
gnzsoloyo tiene algunos puntos positivos de karma
 
Avatar de gnzsoloyo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 826
Re: ¿Alguien me puede decir qué está mal en esta consulta?

El hecho de que en un server funcionara y en otro no puede ser por un conflicto de versiones. Habría que ver qué versión de MySQL está corriendo en cada uno.
En cuanto a la consulta en sí, yo la encuentro personalmente confusa. Me parece que estás cruzando segmentos que MySQL no puede resolver adecuadamente.
Para que se entienda mejor, un segmento de condicionales como:
Código:
 AND  (`S`.`assignment_id` = 1  OR  `S`.`assignment_id` IS NULL )
AND  `S`.`original_id` IS NULL
no pertenece al predicado de un LEFT JOIN ... ON, sino a un WHERE.
Esto es, un JOIN establece una relación entre valores de dos campos de dos tablas distintas, condición que se determina en el ON.
El segmento que escribiste no determina ningua relación entre las dos, por lo que MySQL debe estar haciendo otra cosa y entremezclandola con el ON. Es posible que esté tomando 'U.user_id' como alias o como tabla de origen de otro valor, por lo que no puede resolverlo y lo declara desconocido (estoy hipotetizando, nunca vi una consulta escrita así en todos estos años).
Mi sugerencia es que cambies de lugar ese segmento y lo pongas donde tendría uso lógico: en el WHERE, por ejemplo:
Código:
SELECT `U`.`user_id` AS `authId`, 
       CONCAT(`U`.`nom`, ' ', `U`.`prenom`) AS `name`,
	COUNT(`S`.`id`) AS `submissionCount`, `S`.`title`, 
       MIN(`S`.`creation_date`)
FROM `AcaDB`.`user` as `U`, `AcaDB`.`cours_user` as `CU`
LEFT JOIN  `No2008287`.`wrk_submission` AS `S` 
ON  `S`.`user_id` = `U`.`user_id`
WHERE `U`.`user_id` = `CU`.`user_id` 
     AND `CU`.`code_cours` = '2008287'
     AND (`S`.`assignment_id` = 1  OR  `S`.`assignment_id` IS NULL)
     AND `S`.`original_id` IS NULL 
GROUP BY  `U`.`user_id`
ORDER BY `CU`.`statut` ASC, `CU`.`tutor` DESC, 
     `U`.`nom` ASC, `U`.`prenom` ASC
gnzsoloyo está desconectado   Responder Citando
Antiguo 20-mar-2008, 19:38   #3 (permalink)
lucasarts_18 ha deshabilitado el karma
 
Fecha de Ingreso: enero-2007
Mensajes: 231
Re: ¿Alguien me puede decir qué está mal en esta consulta?

Cita:
Iniciado por gnzsoloyo Ver Mensaje
En cuanto a la consulta en sí, yo la encuentro personalmente confusa. Me parece que estás cruzando segmentos que MySQL no puede resolver adecuadamente.
Para que se entienda mejor, un segmento de condicionales como:
Código:
 AND  (`S`.`assignment_id` = 1  OR  `S`.`assignment_id` IS NULL )
AND  `S`.`original_id` IS NULL
no pertenece al predicado de un LEFT JOIN ... ON, sino a un WHERE.
Hola, esto me es correcto, tiene el mismo funcionamiento tanto en el where como en el join , funciona para en ambas partes, no así si da lo mismo en cuanto a rendimiento, si es filtrado podría ir mejor en el where.

Por otra parte lo que si me parece extraño, y creo que no se puede usar as en el join para darle un alias a la tabla, yo te recomiendo como dice nuestro compañero pasar la parte de filtrado al where y no usar alias, pon el nombre completo de la tabla.

Haz las pruebas y nos cuenta que tal.

Hasta Luego .-
lucasarts_18 está desconectado   Responder Citando
Antiguo 24-mar-2008, 13:12   #4 (permalink)
qvixote ha deshabilitado el karma
 
Avatar de qvixote
 
Fecha de Ingreso: marzo-2008
Mensajes: 27
Re: ¿Alguien me puede decir qué está mal en esta consulta?

Hola!

Gracias por las respuestas.

Las versiones de mysql-server del servidor antiguo, donde si funcionaba la consulta, y del servidor nuevo donde no funciona son 4.0.21 y 5.0.45 respectivamente.

La consulta no la hice yo, la hizo la comunidad de desarrollo de Claroline.

Haré la prueba modificando la consulta como me recomiendan y veremos cómo me va.

¡Muchas gracias!
qvixote está desconectado   Responder Citando
Antiguo 24-mar-2008, 13:18   #5 (permalink)
qvixote ha deshabilitado el karma
 
Avatar de qvixote
 
Fecha de Ingreso: marzo-2008
Mensajes: 27
Re: ¿Alguien me puede decir qué está mal en esta consulta?

Acabo de probar la consulta con los cambios y me sigue dando el mismo error.
qvixote está desconectado   Responder Citando
Antiguo 25-mar-2008, 07:59   #6 (permalink)
quimfv tiene algunos puntos positivos de karma
 
Fecha de Ingreso: marzo-2008
Mensajes: 442
Re: ¿Alguien me puede decir qué está mal en esta consulta?

Creo que el problema lo puedes tener en que el LEFT JOIN se esta haciendo entre
`AcaDB`.`cours_user` as `CU`y `No2008287`.`wrk_submission` AS `S` y NO sobre (`AcaDB`.`user` as `U`, `AcaDB`.`cours_user` as `CU`) por eso da error la clausula ON ya que esta pertenece al LEFT JOIN. Deberias definir la relacion de `AcaDB`.`user` as `U` con las otras tablas.


Código:
FROM `AcaDB`.`user` as `U`,
  `AcaDB`.`cours_user` as `CU`

LEFT JOIN `No2008287`.`wrk_submission` AS `S` ON `S`.`user_id` = `U`.`user_id`
  AND ( `S`.`assignment_id` = 1 OR `S`.`assignment_id` IS NULL )
  AND `S`.`original_id` IS NULL WHERE `U`.`user_id` = `CU`.`user_id`
  AND `CU`.`code_cours` = '2008287'
intenta esto

....

Código:
....

FROM (`AcaDB`.`user` as `U` 
                    JOIN  `AcaDB`.`cours_user` as `CU` 
                             ON `U`.`user_id` = `CU`.`user_id`)  
             LEFT JOIN `No2008287`.`wrk_submission` AS `S` 
                          ON `S`.`user_id` = `U`.`user_id`
  WHERE  (`S`.`assignment_id` = 1 
                         OR `S`.`assignment_id` IS NULL )  
               AND `S`.`original_id` IS NULL  
               AND `CU`.`code_cours` = '2008287'
JOIN tu sabras si debe ser JOIN o LEFT JOIN.


Quim
quimfv está desconectado   Responder Citando
Antiguo 25-mar-2008, 11:47   #7 (permalink)
qvixote ha deshabilitado el karma
 
Avatar de qvixote
 
Fecha de Ingreso: marzo-2008
Mensajes: 27
Re: ¿Alguien me puede decir qué está mal en esta consulta?

¡Eureka!

¡Muchas gracias, Quim!

Tenían todos razón del lugar del problema. Ahora he corregido la consulta de la firma que Quim me recomendó y todo sale muy bien, ya no tengo problemas. Ahora me toca buscar todas las partes del sistema donde haya un error similar y corregirlo. Ahora sé cómo.


Muchas gracias a todos, nuevamente.
qvixote está desconectado   Responder Citando
Antiguo 31-mar-2008, 09:16   #8 (permalink)
qvixote ha deshabilitado el karma
 
Avatar de qvixote
 
Fecha de Ingreso: marzo-2008
Mensajes: 27
Re: ¿Alguien me puede decir qué está mal en esta consulta?

Como comentario final, he descubierto lo que realmente faltaba: paréntesis en el FROM.

Al aplicar la correción que me propuso Quim funcionó perfectamente, pero en verdad la primera consulta no estaba mal, sólo le faltaba encerrar entre paréntesis lo que estaba después del FROM y antes de los LEFT JOIN. Así, la consulta de esta forma:


Código:
SELECT `U`.`user_id` AS `authId`,
  CONCAT(`U`.`nom`, ' ', `U`.`prenom`) AS `name`,
  COUNT(`S`.`id`) AS `submissionCount`,
  `S`.`title`,
  MIN(`S`.`creation_date`)

FROM (`AcaDB`.`user` as `U`, `AcaDB`.`cours_user` as `CU`)

LEFT JOIN `No2008287`.`wrk_submission` AS `S` ON `S`.`user_id` = `U`.`user_id`
  AND ( `S`.`assignment_id` = 1 OR `S`.`assignment_id` IS NULL )
  AND `S`.`original_id` IS NULL WHERE `U`.`user_id` = `CU`.`user_id`
  AND `CU`.`code_cours` = '2008287'

GROUP BY `U`.`user_id`

ORDER BY `CU`.`statut` ASC, `CU`.`tutor` DESC, `U`.`nom` ASC, `U`.`prenom` ASC

funciona sin problemas. Eso debe ser una exigencia de MySQL 5. A tenerlo en cuenta para consultas futuras.

Saludos.
qvixote está desconectado   Responder Citando
Respuesta

No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 23:06.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93