Por ejemplo: SELECT * FROM T donde T.id EN (4,78,12,45)MySQL cláusula de 'IN' y el conjunto de registros devuelto fin
Quiero el registro devuelto encuentra a fin por la posición en la cláusula 'IN'. ¿Cómo puedo hacer esto?
Por ejemplo: SELECT * FROM T donde T.id EN (4,78,12,45)MySQL cláusula de 'IN' y el conjunto de registros devuelto fin
Quiero el registro devuelto encuentra a fin por la posición en la cláusula 'IN'. ¿Cómo puedo hacer esto?
que podría hacerlo usando FIND_IN_SET, por ejemplo,
SELECT * FROM T WHERE T.id IN(4,78,12,45)
ORDER BY FIND_IN_SET(T.id,'4,78,12,45');
Si bien tiene que duplicar la lista, si está generando la consulta en código esto no es un gran problema.
En el caso general, no puede. SQL no garantiza el orden a menos que use la cláusula ORDER BY
, y no puede vincularse con el contenido de una declaración IN
.
Sin embargo, si puede compilar una tabla temporal que ordene los valores que está seleccionando, puede unirse a esa tabla y ordenarla.
Por ejemplo, usted tiene una tabla temporal que contiene algo como lo siguiente:
id | order
----+------
4 | 1
78 | 2
12 | 3
45 | 4
A continuación, puede pedir así:
SELECT T.*
FROM T
INNER JOIN temp
ON T.id = temp.id
ORDER BY temp.order ASC
mientras me gusta la limpieza de la solución ofrecida por Paul Dixon. Esto podría ser más fácil de entender e incluso más rápido. –
No se puede ordenar por la cláusula IN. Debe proporcionar una cláusula ORDER BY por separado. Una forma de hacerlo es la siguiente al compilar una declaración de caso en ORDER BY. Aunque no es lindo.
SELECT
*
FROM
T
WHERE
T.Id IN(4, 78, 12, 45)
ORDER BY
CASE
WHEN T.Id = 4 THEN 1
WHEN T.Id = 78 THEN 2
WHEN T.Id = 12 THEN 3
WHEN T.Id = 45 THEN 4
END
+1 por enseñarme sobre algo que no sabía sobre MySQL. – Welbog
+1 agradable y limpio! me gusta, deseo servidor sql lo tenía. –
Para casos pequeños como este, esto debería ser bastante eficiente, pero si su lista de selección es grande, me imagino que el enfoque de tabla temporal será más eficiente. –