RLIKE con subconsulta?

Tengo una consulta

select X from survey
where survey_date > date_add(curdate(), interval -90 day)

que muestra qué X son actuales. Pero desafortunadamente, debido a circunstancias fuera de mi control, los valores devueltos no son una lista de valores sino una lista de listas de valores separados por comas. Entonces regresa

| X                  |
+--------------------+
|thing1              |
|thing2,thing3,thing4|
|thing5              |
|thing6,thing7       |

Etcétera.

Ahora quería usar esto como una subconsulta. Si los datos fueran uno a una línea, haría

select Y from othertable
where irrelevant_conditions && Y not in (
    select X from survey
    where survey_date > date_add(curdate(), interval -90 day)
);

Pero esto no funciona ya que podría tener, digamos thing3.

En su lugar tengo que hacer RLIKE. (Da la casualidad de que los datos no pueden colisionar por su forma, por lo que no se necesita magia adicional de expresiones regulares aquí para verificar las comas). ¿Es eso posible en MySQL?

preguntado el 03 de mayo de 12 a las 19:05

2 Respuestas

Para buscar en una cadena separada por comas, puede usar encontrar_en_conjunto. Si Y no es una cadena, se realiza una operación de conversión implícita.

select Y from othertable 
where irrelevant_conditions && not exists (
    select  1
    from survey
    where 
     survey_date > date_add(curdate(), interval -90 day) and
     find_in_set(othertable.Y, X) > 0 
);

contestado el 23 de mayo de 17 a las 11:05

Eso parece justo lo correcto. Pero cuando ejecuto la subconsulta con algún valor específico para Y no me da nada cuando debería darme algo. - Charles

¡los parámetros están invertidos! tratar select find_in_set('bar', f) ... - bohemio

@Bohemian: Gracias, eso fue todo. - Charles

La consulta intrincada de danhip se puede simplificar a:

select Y from othertable 
join survey on survey_date > date_add(curdate(), interval -90 day)
    and find_in_set(othertable.Y, X) = 0 
where irrelevant_conditions

contestado el 03 de mayo de 12 a las 20:05

Esto muestra los casos en los que hay alguna fila para la cual find_in_set(othertable.Y, X) = 0, en lugar de que sea 0 para todas las filas. - Charles

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.