2011-03-02 24 views
6

Esto podría ser lo suficientemente simple con SQL básico o podría necesitar un REGEXP, pero me he topado con un muro de ladrillos.Consulta de MySQL para buscar un campo con cadena JSON

Mi datos se almacenan en una cadena JSON como estos dos ejemplos (cada uno en 1 campo):

 
[{"id":"2","value":["1","3"]},{"id":"3","value":["1","2"]}] 

y:

 
[{"id":"3","value":["2"]},{"id":"3","value":["1","2","5"]}] 

Quiero buscar valores entre esos últimos soportes que puede consistir en muchos números ["1","2","5"] or just a single on ["2"]. Los números iniciales corresponden a 2 categorías: la única "id":"2" y "id":"3".

El uso de %"2"% con un LIKE simple por supuesto coincide con todo. Puedo consultar por el "id":"$var" para devolver cada categoría y luego usar PHP para filtrarla después de que tengamos los resultados, pero los datos pueden ser bastante grandes y estoy seguro de que es fácil para un gurú de SQL.

No tengo la opción de cambiar el formato del campo, debe permanecer como JSON.

¡Cualquier ayuda apreciada! Gracias.

Respuesta

14

Creo que lo resolví usando esto: AND extra_fields REGEXP '(.*"id":"2".*)("\[.*"1".*\]")'. Es más que ver con las expresiones regulares de lo que tiene que ver con MySQL: P

comentario: (no pude encontrar el botón comentario)
Esta sintaxis se vuelve más clara cuando se entera de que "extra_fields" es el nombre de la columna en la tabla

+0

serías capaz de ayudarme en un problema similar? ''" (. * \ "Reticle. * \": \ "*.'. $ Reticle2. '. * \") "' 'Es lo que mi' REGEXP' se ve y es un parámetro para enlazar ': reticle' . La consulta funciona pero no hay resultados. – r3wt

+0

Solo quiero agregar que este tipo de consultas no pueden indexarse, por lo que si está utilizando esto en un sitio web de alto tráfico, dichas implementaciones pueden generar grandes éxitos de rendimiento. – Oddman

0

En SQL es realmente simple, porque solo necesita identificar el último paréntesis de apertura. Esto puede hacer con el índice de subcadena.

Tal vez su tabla denominada prueba, y su campo con la cadena de llamada de texto - esto debería funcionar

select text from (select substring_index(text,'[',-1) as text from test) as new where text like '%5%'** 

Si usted tiene un texto de entre 2 delimitadores únicas, tal vez u encontrar this tutorial útiles

Cuestiones relacionadas