Order by no funciona – PHP

publicado por: Anonymous

Tengo esta tabla:

introducir la descripción de la imagen aquí

Hago esta consulta para obtener datos ordenados y crear un select:

select id, nombre from usuarios_grupos ORDER BY `nombre` ASC 

… y este es el resultado, sorpresivamente no lo ordena.

introducir la descripción de la imagen aquí

Antes funcionaba ¿Qué he cambiado?

Pues he pasado de un servidor dedicado Windows a otro con Linux y Apache.

Añado 12/1/17:

Lo curioso es que sí aplica un tipo de orden, es decir, esta consulta:

select id, nombre from usuarios_grupos ORDER BY nombre ASC

Devuelve:
Id nombre Ascendente 1
10 Módulo pago
4 Supervisor
9 Tienda
2 Administrador
1 Creador
8 Socio
3 Usuario

Y esta consulta:

select id, nombre from usuarios_grupos ORDER BY nombre DESC

Devuelve:
id nombre Descendente 1
3 Usuario
8 Socio
1 Creador
2 Administrador
9 Tienda
4 Supervisor
10 Módulo pago

Este es el código php que se ejecuta, con el mismo resultado:

<select name="id_grupo" size="1" <?=$noacceso?>>
<?php
$sql = "select id, nombre from usuarios_grupos";
if((int)$_SESSION["grupo"] !== 1) $sql .= " where id<>1" ;
$sql .= " order by nombre";

$result = $conn->query($sql) Or Die ("ER0081: Error cargando datos");

while($rs = $result->fetch_object())
{
    If ((int)$rs->id !== $id_grupo)
    {
        Echo "<option value='" . $rs->id . "'>" . $rs->nombre . "</option>";
    }
    Else
    {
        Echo "<option selected value='" . $rs->id . "'>" . $rs->nombre . "</option>";
    }
}
$result->close();
?>

solución

Te pedí correr la consulta siguiente para diagnosticar el problema:

select id, nombre, ascii(nombre)
  from usuarios_grupos
 order by nombre

Y tu resultado fue:

id  nombre        ascii(nombre) 
--  ------        -------------
10  Módulo pago   32 
4   Supervisor    32 
9   Tienda        32 
2   Administrador 65 
1   Creador       67 
8   Socio         83 
3   Usuario       85

Con ese resultado se puede ver más claramente cuál es el problema. Como puedes ver, el código ASCII del primer carácter de los primeros 3 registros es 32, o sea, un espacio (' ').

De modo que para esos 3 registros, aunque no se vea claramente a primera vista, los nombres tienen los valores siguientes (nota el espacio en frente):

  • ' Módulo pago'
  • ' Supervisor'
  • ' Tienda'

Y como el carácter 32 se considera inferior a los caracteres alfanuméricos, eso explica por qué esos 3 registros aparecen primero.

Obviamente, te tocará decidir cómo arreglar el problemita. Tal vez quieras corregir los datos para remover los espacios en exceso:

update usuarios_grupos
   set nombre = trim(nombre);

O tal vez te conformes con arreglar el ORDER BY para que ignore los espacios de más:

select id, nombre
  from usuarios_grupos
 order by trim(nombre)
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *