MySQL - problemas sql

 
Vista:
sin imagen de perfil

problemas sql

Publicado por juan (6 intervenciones) el 19/05/2017 17:05:09
hola soy nuevo en mysql y en este foro, me gustaria que me ayudaran con una sentencia sql que la hago facil en access pero en mysql me da error y la cual es la siguente:


UPDATE encuesta E LEFT JOIN mun M ON (E.mun = M.Mun) SET E.sec = M.Sec WHERE ((E.swrep = 0) AND (E.user = 1) AND (M.nom Like CONCAT('%', E.nom, '%') AND (M.pat = E.pat) AND (M.mat = E.mat) AND (M.FecNacClaEle Like E.fecnac))

el problema es en

(M.nom Like CONCAT('%', E.nom, '%')

y no se como hacerlo, le agradesco, gracias

y se me ayudaran con un tutorial para hacer los sql en mysql apartr de acces les agradecaria tambien, gracas
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

problemas sql

Publicado por leonardo_josue (414 intervenciones) el 19/05/2017 18:47:29
Hola Juan:

Me gustaría saber qué error es el que te está marcando la consulta, pues lamentablemente en este foro no hay adivinos... el mensaje y/o el código de error puede darte una vista más clara de lo que está mal.

De entrada, analizando tu código veo que hay varias cosas que tienes mal:

1. Te falta un paréntesis de cierre, es decir, si cuentas cuántos paréntesis hay verás que precisamente falta uno al final de la línea que mencionas:

1
(M.nom Like CONCAT('%', E.nom, '%'))

ya que el paréntesis de cierre que hay es de la función CONCAT.

2. En realidad TODOS LOS PARÉNTESIS SON COMPLETAMENTE INÚTILES. es decir, dado que sólo estás utilizando comparaciones tipo AND da lo mismo que pongas estos o no, NO TE DAN ABSULUTAMENTE NINGUNA FUNCIONALIDAD ADICIONAL O MEJORAN LA CONSULTA...

3. ¿por qué utilizas LEFT JOIN si a final de cuentas por las condiciones que pones de PAT y MAT estás haciendo que deban existir elementos en ambas tablas para que se cumplan... además, si quieres hacer una consulta estándar, estas condiciones no deben de ir en el WHERE, sino en el ON de tu JOIN.

4. Si estoy en lo cierto tus campos fM.FecNacClaEle y E.fecnac pueden ser campos de tipo FECHA o DATE, entonces NO DEBES UTILIZAR COMPARACIONES TIPO LIKE ENTRE ESTOS CAMPOS...

Prueba tu consulta así:

1
2
3
4
5
6
7
8
9
10
11
UPDATE encuesta E
INNER JOIN mun M
ON E.mun = M.Mun AND
   M.pat = E.pat AND
   M.mat = E.mat AND
   M.FecNacClaEle = E.fecnac
SET E.sec = M.Sec
WHERE
  E.swrep = 0 AND
  E.user = 1 AND
  M.nom Like CONCAT('%', E.nom, '%')

O al menos quita todos los paréntesis y prueba con tu consulta como la tienes:

1
2
3
4
5
6
7
8
9
10
UPDATE encuesta E
LEFT JOIN mun M ON E.mun = M.Mun
SET E.sec = M.Sec
WHERE
  E.swrep = 0 AND
  E.user = 1 AND
  M.nom Like CONCAT('%', E.nom, '%') AND
  M.pat = E.pat AND
  M.mat = E.mat AND
  M.FecNacClaEle Like E.fecnac

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

problemas sql

Publicado por juanjava (6 intervenciones) el 19/05/2017 20:32:27
hola leonardo

muchísimas gracias por contestar, te comento como lo dije soy nuevo en mysql y estos otros comentarios

si me di cuenta del ) y lo coloque y tampoco nada, ocupo el phpmyadmin y solo meda un error que existe cerca de '' linea 1 eso es todo pero no se como depurar mas mysql así que prueba y error y quite la instrucción (M.nom Like CONCAT('%', E.nom, '%') y funciono para lo que dije que pasa si tengo otro like y ese si funciona ben, pero comento

la funcionalidad de left join, es cierto no se porque los puse si los campos son fijos Pat paterno y Mat materno gracias, la diferencia esta en no nombre que algunas veces solo ponen el primer nombre o el segundo por eso es el like, pero me da problemas y tuve que meter un campo extra de nombre lnom para agregarle los %, quitarle el concat y me quedo (aunque no me gusta) pero gasto espacio de disco

con respecto a los campos M.FecNacClaEle y E.fecnac no son fecha sino string aunque dependen de una fecha
date '2017-01-01' que lo toman como string
y yo lo ocupo con ´170101´ por eso los comodines de '__
y me gustara saber mas de esta diferencia ya que no entiendo bien esto, ya sea en mysql o en php ya que tuve problemas y como mencionaste utilizar ben el like

un manual donde ocupar los join's y los where porque yo me enseñe con los join's pero vi a un amigo que solo utilizaba el where
estoy haciendo las pruebas gracias y te comento
Gracias por lo de los paréntesis,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

problemas sql

Publicado por leonardo_josue (414 intervenciones) el 19/05/2017 21:57:03
Hola de nuevo:

Resulta algo complicado entender tu post O_o pero aquí van algunas otras observaciones.

Primero, siempre que comiences con una entrada en el foro es recomendable que nos digas qué es lo que quieres hacer... en realidad desde el inicio hemos hablado de que la sentencia UPDATE no funciona, pero no nos dices qué es lo que pretendes hacer. Es conveniente también que pongas la estructura de tus tablas y pongas también datos de ejemplo y a partir de esos datos nos digas qué es lo que esperas obtener como resultado. Así, de ser posible, podemos indicarte alguna otra alternativa para llegar al mismo resultado.

Cuando los foristas hablan de que una consulta NO FUNCIONA, hay de dos sopas: la sentencia MARCA ALGÚN ERROR, en cuyo caso deberás decirnos qué error es el que está apareciendo, o la sentencia se ejecuta PERO NO REGRESA EL RESULTADO ESPERADO. en ese caso deberás decirnos el "comportamiento", es decir, qué hace la consulta vs lo que debería hacer.

Ahora bien, el operador LIKE si bien es útil, debes tener cuidado de no abusar de su uso, ya que suele tener un rendimiento bastante pobre. hay otros tipos de búsquedas de cadenas como lo son las expresiones regulares (REGEX) o las búsquedas de texto completo (FULL TEXT SEARCH) pero deberías de decirnos primero qué es lo que pretendes buscar para decirte si alguna de estas búsquedas aplica.

En cuanto los campos fecha, es un terrible error manejar estos campos como VARCHAR, una cosa es cómo almacenas el dato y otra muy distinta es el FORMATO en el que necesitas presentarlo al usuario... existen funciones específicas para el formateo de fechas que NO TIENEN NADA QUE VER CON EL OPERADOR LIKE.

finalmente, te recomiendo que sigas utilizando los JOIN's en lugar se hacer todo en el WHERE... ya que los JOIN's tienen mejor rendimiento, es decir, en lugar de hacer esto:

1
SELECT campo FROM tabla1, tabla2 WHERE tabla1.campo = tabla2.campo

es mejor hacer esto:

1
SELECT campo FROM tabla1(INNER|LEFT|RIGTH) JOIN ON tabla1.campo = tabla2.campo

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

problemas sql

Publicado por juanjava (6 intervenciones) el 20/05/2017 02:36:46
ok muchas gracias por los comentarios y creo te mencione que no funcionaba y no sabia como depurar el mysql xq esta usando el phpmyadmn y no me daba resultados solo me decía en modulo rosa que había algo mal cerca de '' en la linea 1 y de ahí no sabia que hacer, después por prueba y error deduje que estaba mal la sentencia concat por eso pedí ayuda y me hiciste comentaros que los tome en cuenta y aplique algunos join quitando where con ciertas condiciones y bueno también comente que había echo un campo lnom con la replica de nom agregándole % adelante y atrás y que no me gustaba esa forma de hacerlo pero es con lo me quedo. Pero muchismas gracias por los comentarios y te comento que me quedo as

1
2
3
4
5
6
7
8
9
10
UPDATE encuesta E LEFT JOIN forpol.municipios M ON
E.mun = M.Mun AND
M.pat = E.pat AND
M.mat = E.mat
SET E.sec = M.Sec, E.swrep = 1
WHERE
E.swrep = 0 AND
E.user = 1 AND
M.nom Like E.lnom AND
M.FecNacClaEle Like E.fecnac";

y te comente que dentro de nom existe un juan antonio y los usuarios pueden poner solo juan o solo antonio por lo que ocupe el Like

mil gracias por la ayuda y en lo sucesivo colocare mas detalle buena tarde noche o dia gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar