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

LIKE 'nombrecampo' en LEFT JOIN

Estas en el tema de LIKE 'nombrecampo' en LEFT JOIN en el foro de Mysql en Foros del Web. Hola, estoy intentando hacer lo siguiente: Tengo en una tabla los nombres de empresas con su categoria, servicio y demás al que pertenecen. Al hacer ...
  #1 (permalink)  
Antiguo 23/06/2012, 06:48
 
Fecha de Ingreso: mayo-2006
Mensajes: 475
Antigüedad: 18 años
Puntos: 58
LIKE 'nombrecampo' en LEFT JOIN

Hola, estoy intentando hacer lo siguiente:
Tengo en una tabla los nombres de empresas con su categoria, servicio y demás al que pertenecen. Al hacer una consulta necesito que se muestren las empresas que pertenecen a esa categoria, subcategoría y producto o que se muestren las empresas que contienen en el campo mas_servicios el id de la tabla directorio_producto, en el cual se guardan varios id en formato ,id, pero al hacer un LIKE ',directorio_producto.id,' no funciona el asunto y supongo que es porque esto no se hace así :). Alguien me echa una mano? Gracias anticipadas
Código MySQL:
Ver original
  1. SELECT directorio_empresas.imagen, directorio_empresas.url, directorio_empresas.nombre_empresa,
  2. directorio_empresas.direccion, directorio_empresas.telefono, directorio_empresas.email, directorio_empresas.web, directorio_empresas.texto,
  3. directorio_cat.directorio_cat AS directorio_cat, directorio_sub.submenu AS submenu, directorio_producto.producto AS producto, directorio_producto.id
  4. FROM directorio_empresas
  5. LEFT JOIN directorio_sub ON directorio_empresas.submenu = directorio_sub.id
  6. LEFT JOIN directorio_cat ON directorio_cat.id = directorio_empresas.directorio_cat
  7. LEFT JOIN directorio_producto ON directorio_producto.id = directorio_empresas.producto
  8. WHERE directorio_cat.url = 'insumos'
  9. AND directorio_sub.url = 'accesorios_e_insumos'
  10. AND directorio_producto.url = 'canastillas'
  11. OR directorio_empresas.mas_servicios LIKE ',directorio_producto.id,'
  #2 (permalink)  
Antiguo 23/06/2012, 14:46
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: LIKE 'nombrecampo' en LEFT JOIN

Vamos por partes.
Dices que quieres hacer esto:
Cita:
una consulta necesito que se muestren las empresas que pertenecen a esa categoria, subcategoría y producto
o
Cita:
que se muestren las empresas que contienen en el campo mas_servicios el id de la tabla directorio_producto,
Por empezar: MySQL no tiene consultas condicionales. Lo más que puedes hacer es poner dos condiciones distintas usando OR, de modo que te devolverá los registros que cumplan ambas condiciones. Pero también puede devolverte registros repetidos.
No es una buena forma de hacer consultas. Es mejor establecer dos condiciones distintas tales que estés seguro de que no se solapen datos.

Por otro lado dices esto:
Cita:
en el cual se guardan varios id en formato ,id,
No queda claro si ese campo tiene un ID por registro, o en el mismo registro tienes una lista de valores metido en el mismo campo.
En el primer caso, no hay problema. En el segundo, es una metida de pata astronómica, porque eso no se hace de ese modo.

Finalmente, comentas:
Cita:
pero al hacer un LIKE ',directorio_producto.id,' no funciona el asunto y supongo que es porque esto no se hace así
Exactamente. Eso no se hace así.
Comencemos aclarando que LIKE se usa para buscar cadenas dentro de cadenas. No tiene utilidad funcional si vas a comparar un Valor "A" contra el contenido de un campo, porque para que te devuelva el registro, ese campo debe contener... "A". Con lo que esto:
Código MySQL:
Ver original
  1. campo LIKE 'A'
es igual a poner
Código MySQL:
Ver original
  1. campo = 'A'
Con la sola diferencia que LIKE resulta menos eficiente en ese caso (tiene otro algoritmo).

Pero además de este detalle lo estás escribiendo completamente mal.
Código MySQL:
Ver original
  1. directorio_empresas.mas_servicios LIKE ',directorio_producto.id,'
compararía directorio_empresas.mas_servicios contra una cadena de texto que dice ",directorio_producto.id,", no contra el contenido de su campo.
De todos modos, si directorio_producto.id contiene datos numéricos no se usa el LIKE. Ese es para cadenas, no para números, y los resultados pueden ser erráticos.

Aclárame una cosa:
¿Qué contiene directorio_producto.id? ¿Números o colecciones de números como cadena de texto?

Según tu respuesta podremos armar algo mejor.
__________________
¿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 23/06/2012, 17:23
 
Fecha de Ingreso: mayo-2006
Mensajes: 475
Antigüedad: 18 años
Puntos: 58
Respuesta: LIKE 'nombrecampo' en LEFT JOIN

Veo que no lo has entendido. Lo voy a poner mas sencillo

tengo la Tabla1
Los 2 registros y los campos son:
Código MySQL:
Ver original
  1. id=1
  2. categoria=5
  3. mas_categorias= 2,3(valores id tabla2)
  4.  
  5. id=2
  6. categoria=2
  7. mas_categorias= 1,4(valores id tabla2)

Tengo la tabla2

Código MySQL:
Ver original
  1. id=2
  2. categoria=patata
  3.  
  4. id=3
  5. categoria=lechuga
  6.  
  7. id=4
  8. categoria=carne

Consulta: Mostrar registros de la tabla1 cuya categoria sea igual a cinco o que en el campo mas_categorias se encuentre id de la tabla2 que pertenece a la cadena 'carne'
  #4 (permalink)  
Antiguo 23/06/2012, 18:00
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: LIKE 'nombrecampo' en LEFT JOIN

Yo lo entendí perfectamente. Pero tu no me has respondido lo que pregunté, en tu ejemplo no se puede inferir, y de la respuesta depende la sintaxis correcta de la consulta.

Repito:
¿mas_categorias contiene un único valor por registro, o es una colección de valores separados por comas?

Si es una colección de valores puestos en un sólo registro de una sola columna, tienes un error de diseño, y se necesita usar funciones especiales para obtener la respuesta.
Si es un único dato (FK de la otra tabla), es mucho más sencillo, pero requeriría probablemente el uso de una subconsulta.

Como ves, necesito que respondas la pregunta. Y no un ejemplo como lo que has puesot.
Responde la pregunta.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 24/06/2012, 01:08
 
Fecha de Ingreso: mayo-2006
Mensajes: 475
Antigüedad: 18 años
Puntos: 58
Respuesta: LIKE 'nombrecampo' en LEFT JOIN

Es una colección de valores y no es necesaria ninguna función especial porque ya lo he solucionado. Gracias por responder y un saludo
  #6 (permalink)  
Antiguo 24/06/2012, 07:13
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: LIKE 'nombrecampo' en LEFT JOIN

1) Si tienes una sucesión de valores, como te dije, tienes un gravísimo error de diseño, porque eso e sun campo multivaluado y este tipo de campo está prohibido en el modelo e-r. Significa que existe una N:N entre esa tabla y otra más, y requiere una tabla adicional, que no has puesto.
2) LIKE no es funcional en una lista de valores, cuando buscas un valor único. Para eso se usa FIND_IN_SET, que es lo que te quería decir.
3) No has solucionado nada, lo has parchado. No puedes solucionarlo, porque el diseño está mal de entrada y no es eficiente. Lo único que has logrado es posponer los problemas, pero te volverán a aparecer en otro contexto.
4) En FDW, como foro colaborativo, la costumbre es postear la solución encontrada, para compartirla con aquellos a los que peuda servirles en el futuro. Y no lo estás haciendo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 24/06/2012, 11:08
 
Fecha de Ingreso: mayo-2006
Mensajes: 475
Antigüedad: 18 años
Puntos: 58
Respuesta: LIKE 'nombrecampo' en LEFT JOIN

La solución ha sido, como bien indicas, crear un tabla de apoyo adicional. Gracias de nuevo
  #8 (permalink)  
Antiguo 24/06/2012, 11:17
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: LIKE 'nombrecampo' en LEFT JOIN

OK

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: join, left, select, tabla, campos
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 08:22.