Estoy tratando de hacer una búsqueda en valores meta de publicaciones serializadas en una base de datos de wordpress. Conozco la estructura de la cadena de serie, por lo que puedo buscar el valor anterior, obtener el índice y luego obtener la cantidad de caracteres que quiero antes de ese valor de índice. No puedo usar expresiones regulares de manera efectiva en esta consulta en particular porque me gustaría ordenar según los resultados. Esto es lo que tengo hasta ahora, pero estoy fallando en la sintaxis y creo que tiene que ver con intentar usar la palabra clave AS y agrupar las declaraciones AND.
SELECT SQL_CALC_FOUND_ROWS _posts.ID FROM _posts INNER JOIN _postmeta ON (_posts.ID = _postmeta.post_id) WHERE 1=1 AND _posts.post_type="dog" AND (_posts.post_status="publish") AND ( (_postmeta.meta_key = '_meta_general' AND CAST(_postmeta.meta_value AS CHAR)) AS dmet AND POSITION(';s:6:\"weight' IN dmet) AS ddex AND MID(dmet ,ddex,10)) AS dres GROUP BY dres ORDER BY dres ASC LIMIT 0, 10
Bueno, todavía tengo problemas con la estructura de esta cosa. El código anterior no funcionó, @fenway, después de una inspección más detallada. Esto es lo que tengo ahora. El problema con la respuesta de @fenway es que los valores MID y POSITION se llamaron en la parte seleccionada de la declaración que seleccionaba las publicaciones “DE”. Están ubicados en postmeta. Así que intenté reorganizar el filtrado de cadenas después de INNER JOIN que une la tabla postmeta a la tabla de publicaciones por id. Esto no está funcionando. Entiendo que esta pregunta se debe simplemente a mi falta de conocimiento en SQL, pero estoy tratando de aprender aquí.
Ninguno de estos está funcionando como yo quiero. Hay errores sintácticos. El propósito del código es agrupar la consulta devuelta por un valor que está dentro de una cadena serial (json). El método es buscar el siguiente valor (en este caso sería – “;s:6:”weight -) Cuando tenga el índice de esta cadena quiero devolver los 10 valores anteriores (una fecha xx/xx/ xxxx). Quiero etiquetar esta cadena (AS dres) y ordenar el resultado por dres. WordPress recopila las publicaciones de la tabla de publicaciones, luego recopila el meta de la publicación de la tabla postmeta. La metatabla de publicación es donde se almacena el json. Es realmente un algoritmo simple, es solo la sintaxis lo que me está jodiendo.
SELECT SQL_CALC_FOUND_ROWS {$wpdb->posts}.ID FROM {$wpdb->posts} INNER JOIN {$wpdb->postmeta} MID(CAST({$wpdb->postmeta}.meta_value AS CHAR), POSITION(';s:6:\"weight' IN CAST({$wpdb->postmeta}.meta_value AS CHAR) ),10 ) AS dres ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id) WHERE 1=1 AND {$wpdb->posts}.post_type="dog" AND ({$wpdb->posts}.post_status="publish") AND {$wpdb->postmeta}.meta_key = '_meta_general' AND POSITION(';s:6:"weight' IN CAST({$wpdb->postmeta}.meta_value AS CHAR)) > 0 GROUP BY {$wpdb->posts}.ID ORDER BY dres ASC LIMIT 0, 10
Eso es lo que un desarrollador principal tiene que decir sobre la búsqueda y los datos serializados:
the SQL language does not understand serialized data.
– brasofilo
24 de febrero de 2013 a las 22:14
Entiendo que debe estructurar su meta entrada en torno al propósito de la misma, y si planea ejecutar consultas con los datos, es mejor tener campos separados asignados a cada bit de datos. Sin embargo, hay momentos en los que esto no es necesariamente posible (es decir, desarrollar sobre el complemento de otra persona). Es posible que SQL no comprenda los datos serializados, pero entiende las cadenas y, siempre que conozca el formato de la cadena serial, puede buscar subcadenas relacionadas con los datos que necesita. La reestructuración de Fenway de mis intentos anteriores me ayudó a ponerme en el camino correcto.
– Aryan Duntley
25 de febrero de 2013 a las 0:41
Genial, estoy marcando esta pregunta y respuesta como favorita para futuras referencias.
– brasofilo
25 de febrero de 2013 a las 8:46