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

Sentencia para buscar CAMPO en cadena

Estas en el tema de Sentencia para buscar CAMPO en cadena en el foro de Bases de Datos General en Foros del Web. Holas, tengo una cadena con _ como separador:ej. $cadena="_1__2__3__4_"; Y quiero buscar UN campo en esta cadena así: $geg=mysql_query("SELECT tabla_id,CONCAT('_',tabla_id,'_') AS tablacat FROM tabla_users WHERE ...
  #1 (permalink)  
Antiguo 25/06/2011, 14:15
 
Fecha de Ingreso: noviembre-2008
Mensajes: 84
Antigüedad: 15 años, 5 meses
Puntos: 1
Sentencia para buscar CAMPO en cadena

Holas, tengo una cadena con _ como separador:ej.
$cadena="_1__2__3__4_"; Y quiero buscar UN campo en esta cadena así:

$geg=mysql_query("SELECT tabla_id,CONCAT('_',tabla_id,'_') AS tablacat FROM tabla_users WHERE user_id <> '$uid' AND LOCATE(tablacat,'$cadena')>0 ORDER BY RAND() LIMIT 1");

Resumiendo, XD, quisiera que la consulta me diga si el valor del campo TABLA_ID, se encuentra en la variable $CADENA.

Y luego en PHP, me da el error de que la consulta tiró un Bool en vez de un parámetro:
while ($row=mysql_fetch_array($geg))

"Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given"

También intenté con "...tabla_id IN($cadena)..." pero nada.

Estuve un par de horas y ya creo que es tiempo de recurrir al solucionador como es este foro
  #2 (permalink)  
Antiguo 25/06/2011, 16:49
 
Fecha de Ingreso: noviembre-2008
Mensajes: 84
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: Sentencia para buscar CAMPO en cadena

Bueno seguí investigando y la solución era muy sencilla, usando la funcion INSTR:

Código MySQL:
Ver original
  1. SELECT tabla_id FROM grupo_users WHERE INSTR('$cadena',CONCAT('_',tabla_id,'_'))=0 AND uid<>'$mi_id' LIMIT 1

Está en el manual de MySQL sobre Cadenas




Última edición por nanitoz; 25/06/2011 a las 16:51 Razón: fuente
  #3 (permalink)  
Antiguo 25/06/2011, 17:11
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: Sentencia para buscar CAMPO en cadena

Cita:
$geg=mysql_query("SELECT tabla_id,CONCAT('_',tabla_id,'_') AS tablacat FROM tabla_users WHERE user_id <> '$uid' AND LOCATE(tablacat,'$cadena')>0 ORDER BY RAND() LIMIT 1");

Resumiendo, XD, quisiera que la consulta me diga si el valor del campo TABLA_ID, se encuentra en la variable $CADENA.
El problema es que estás tratando de encontrar un valor con el WHERE dado usando para ello el ALIAS de un campo del select, y en el WHERE no admite usar ALIAS de las columnas. Sólo puedes usar el alias de la tabla.

Cita:
Y luego en PHP, me da el error de que la consulta tiró un Bool en vez de un parámetro:
while ($row=mysql_fetch_array($geg))

"Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given"

También intenté con "...tabla_id IN($cadena)..." pero nada.
En este caso el error es de PHP, no de MySQL, probablemente originado en el error de sintaxis de la consulta, que ya te mencioné.
Por otro lado, si bien la programación es un tema fuera del alcance del foro, te puedo decir que el error básicamente se origina en que cuando envías a hacer una consult aala base, siempre, siempre, siempre se debe verificar que el resultado sea una tabla de datos antes de intentar recorrerla. Eso es lo que haces mal: Mandas la consulta, y quieres recorrerla sin saber si realmente te está devolviendo algo válido primero.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 25/06/2011, 17:14
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: Sentencia para buscar CAMPO en cadena

Cita:
Iniciado por nanitoz Ver Mensaje
Bueno seguí investigando y la solución era muy sencilla, usando la funcion INSTR:

Código MySQL:
Ver original
  1. SELECT tabla_id FROM grupo_users WHERE INSTR('$cadena',CONCAT('_',tabla_id,'_'))=0 AND uid<>'$mi_id' LIMIT 1
Si la usas sin el CONCAT(), probablemente te de el mismo resultado:

Código MySQL:
Ver original
  1. SELECT tabla_id
  2. FROM grupo_users
  3.     INSTR('$cadena', tabla_id)>0 AND uid<>'$mi_id'
__________________
¿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 25/06/2011, 18:04
 
Fecha de Ingreso: noviembre-2008
Mensajes: 84
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: Sentencia para buscar CAMPO en cadena

Gracias por las aclaraciones, efectivamente le ponía un alias a un campo, no a la tabla >_<

Estoy utilizando el CONCAT para agregar el separador _ , ya que guardo en la variable antes _1__2_ y así sucesivamente...y si le doy que busque 1, puede "dar positivo" en un _11__12_ thx!
  #6 (permalink)  
Antiguo 25/06/2011, 19:11
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: Sentencia para buscar CAMPO en cadena

Cita:
Estoy utilizando el CONCAT para agregar el separador _ , ya que guardo en la variable antes _1__2_ y así sucesivamente...y si le doy que busque 1, puede "dar positivo" en un _11__12_ thx!
Lo que pasa es que estás complicando las cosas innecesariamente.
Si el campo contiene "1", "11" o "12", y lo que quieres hacer es buscar aquellos casos en los que ese campo está dentro de un conjunto de valores, estás usando la función y el método equivocado.
Eso se hace más o menos así:
Código MySQL:
Ver original
  1. SELECT tabla_id
  2. FROM grupo_users
  3.     tabla_id IN('1','2','11','13','14') AND uid<>'$mi_id'
Donde cada valor posible se pone en el paréntesis, separado por coma de los demás. Esta sentencia, a nivel de PHP se construye dinámicamente con los valores seleccionados.
En el caso de querer tomar una sola variable que contenga los valores, para buscar uno entre varios, lo mejor es usar una variable que los contenga así: "1, 2, 3, 11, 13, 14", y usar la función FIND_IN_SET():
Código MySQL:
Ver original
  1. FROM tabla
  2. WHERE FIND_IN_SET(COLUMNA, $variable)>0;

FIND_IN_SET() devuelve el número de la posición del valor donde se encontró el buscado, o cero, si no está.

Ejemplo:
Código MySQL:
Ver original
  1. mysql> SELECT FIND_IN_SET('14','1,2,3,4,6,13,14,34') posicion;
  2. +----------+
  3. | posicion |
  4. +----------+
  5. |        7 |
  6. +----------+
  7. 1 row in set (0.00 sec)
__________________
¿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 25/06/2011, 20:04
 
Fecha de Ingreso: noviembre-2008
Mensajes: 84
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: Sentencia para buscar CAMPO en cadena

Sí, buena aclaración, pasa que yo hago la lógica en PHP mas o menos y me olvido que se pueden simplificar las cosas con MySQL al mismo tiempo
  #8 (permalink)  
Antiguo 25/06/2011, 21:34
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: Sentencia para buscar CAMPO en cadena

El SQL tiene una enorme potencia para manejar datos. Tenlo en cuenta. Lo que no tiene son buenos recursos para hacer validaciones, porque eso sí es competencia de los lenguajes de programación.
Pero consultar conjuntos de datos complejos, relaciones entre tablas y todo eso... Eso es el dominio de los DBMS.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 28/06/2011, 06:07
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Sentencia para buscar CAMPO en cadena

No repitas los post. O aclara que es lo que ahora no te funciona....


$geg=mysql_query("SELECT tabla_id,CONCAT('_',tabla_id,'_') AS tablacat FROM tabla_users WHERE user_id <> '$uid' AND LOCATE(tablacat,'$cadena')>0 ORDER BY RAND() LIMIT 1");

Retorna FALSE si falla la consulta...
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Etiquetas: mysql, bases-de-datos
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 06:23.