Usando MySQL, estoy seleccionando una lista de canciones en español que me gustaría ordenar. Aquí hay una lista de nombres devueltos por la consulta:Ordenar utilizando caracteres utf en mysql o php? mejores soluciones
- ¡Decirevilla!
- Alhambra
- 123 Pasitos
- África
- Arroz
- Decir
La lista ordenada debe tener este aspecto:
- 123 Pasitos
- África
- Alhambra
- Arroz
- ¡Decirevilla!
- Decir
Después de toda la investigación que he leído, he concluido que no hay manera razonable de lograr esto usando MySQL. Probé collation, charset, etc ... pero no hay forma de que el carácter ¡,?, Etc. ... pueda ordenarse según el resultado deseado. Incluso el Á no está ordenado de la manera que quiero ...
Pregunta 1: ¿Es esta una conclusión razonable?
Creo que la única manera de lograr esto es pasar los resultados a una matriz en php y luego ordenar la matriz usando una función personalizada ... todo esto usando la función de usort (necesito ordenar por valor y no lo hago) t se preocupa por mantener la asociación de claves). Algo similar a esto:
function normalize($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
$tracks = array();
while ($row = $result->fetch_assoc()) {
$tracks[] = $row;
}
usort($tracks, 'normalize');
Pregunta 2: ¿Es esta la mejor manera de lograr una clasificación personalizada?
Aquí es donde yo estoy golpeando una pared:
Pregunta 3: No tengo idea de cómo crear la función de normalizar para ordenar los nombres de acuerdo a mis necesidades. ¿Cómo ignoro ciertos caracteres (¡,?, ',!, ¿) Y cómo reemplazo otros caracteres con el equivalente natural (Á -> A, É -> E, etc.) Creo que al ignorar ciertos caracteres y reemplazando otros, puedo lograr la clasificación que estoy buscando ...
Pregunta 4: ¿Todo esto tiene sentido? ¿Estoy en el camino correcto?
Gracias de antemano por todos sus consejos. Marco
¿Puedo agregar mi propia recopilación a MySQL si estoy en un host compartido? – Marco
@Marco: Eso depende del proveedor de alojamiento, pero probablemente me inclinaría hacia "probablemente no". Si no puede, el enfoque 'sortable_title' hará el trabajo casi igual de bien. –
Acabo de terminar de programar ambos métodos y el que tiene sortable_title es mucho, mucho más rápido. He agregado un temporizador y los resultados promedio para la solución mysql: 0.009 segundos ... solución php: 0.12 segundos. Lo extraño es que he almacenado la lista en la memoria caché (utilizando el método ob_start() ..) y el almacenamiento en caché se nota más lento ... Supongo que, en este caso específico, la apertura del archivo en caché es más lenta que la ejecución de una consulta. ..Hace que te preguntes que el almacenamiento en memoria caché en php no siempre es necesario ... – Marco