two - MySQL-ORDER BY valores dentro de IN()
order by two columns mysql (6)
Espero ordenar los elementos devueltos en la siguiente consulta por el orden en que se ingresaron en la función IN () .
ENTRADA:
SELECT id, name FROM mytable WHERE name IN (''B'', ''A'', ''D'', ''E'', ''C'');
SALIDA:
| id | name |
^--------^---------^
| 5 | B |
| 6 | B |
| 1 | D |
| 15 | E |
| 17 | E |
| 9 | C |
| 18 | C |
¿Algunas ideas?
Necesita otra columna (numérica) en su tabla, en la que especifique el orden de clasificación. La cláusula IN no funciona de esta manera.
B - 1
A - 2
D - 3
E - 4
C - 5
Otra opción desde aquí: http://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html
select *
from tablename
order by priority=''High'' DESC, priority=''Medium'' DESC, priority=''Low" DESC;
Entonces, en su caso (no probado) sería
SELECT id, name
FROM mytable
WHERE name IN (''B'', ''A'', ''D'', ''E'', ''C'')
ORDER BY name = ''B'', name = ''A'', name = ''D'', name = ''E'', name = ''C'';
Dependiendo de lo que estés haciendo, he encontrado que es un poco peculiar, pero siempre funcionó después de jugar un poco.
Pruebe algo como
... ORDER BY (CASE NAME WHEN ''B'' THEN 0 WHEN ''A'' THEN 1 WHEN ...
Puede ser que esto pueda ayudar a alguien (p_CustomerId se pasa en SP):
SELECT CompanyAccountId, CompanyName
FROM account
LEFT JOIN customer where CompanyAccountId = customer.AccountId
GROUP BY CompanyAccountId
ORDER BY CASE WHEN CompanyAccountId IN (SELECT AccountId
FROM customer
WHERE customerid= p_CustomerId)
THEN 0
ELSE 1
END, CompanyName;
Descripción: Quiero mostrar la lista de cuentas. Aquí estoy pasando una identificación de cliente en sp. Ahora se enumerarán los nombres de las cuentas con cuentas vinculadas a los que los clientes se muestran en la parte superior seguido por otras cuentas en orden alfabético.
Solo usa
order by INSTR( '',B,C,D,A,'' , concat('','' , `field`, '','' ) )
evitar la situación como
INSTR(''1,2,3,11'' ,`field`)
terminará con una fila de resultados desordenada: 1 y 11 alternante
SELECT id, name
FROM mytable
WHERE name IN (''B'', ''A'', ''D'', ''E'', ''C'')
ORDER BY FIELD(name, ''B'', ''A'', ''D'', ''E'', ''C'')
La función FIELD devuelve la posición de la primera cadena en la lista restante de cadenas.
Sin embargo, es mucho mejor para el rendimiento tener una columna indexada que represente su orden de clasificación, y luego ordenar por esta columna.