Si entendí bien, parece que puedes usar expresiones en tu ORDER BY
, de manera similar a la respuesta aceptada dada a la siguiente publicación de desbordamiento de pila:
Por lo tanto, su consulta podría verse así:
SELECT imageID
FROM ...
JOIN ...
WHERE designID = 100
ORDER BY garmentID = 1 DESC,
colorID = 5 DESC,
sizeID = 10 DESC;
Tenga en cuenta que garmentID
, colorID
y sizeID
no se utilizan como filtros en WHERE
cláusula. Los valores solo se usan en el ORDER BY
expresiones.
Caso de prueba:
CREATE TABLE designs (designID int, garmentID int, colorID int, sizeID int);
INSERT INTO designs VALUES (100, 1, 1, 1);
INSERT INTO designs VALUES (100, 1, 2, 2);
INSERT INTO designs VALUES (100, 1, 5, 3);
INSERT INTO designs VALUES (100, 1, 5, 10);
INSERT INTO designs VALUES (100, 1, 5, 15);
INSERT INTO designs VALUES (100, 1, 8, 20);
INSERT INTO designs VALUES (100, 2, 5, 10);
INSERT INTO designs VALUES (100, 2, 6, 15);
INSERT INTO designs VALUES (101, 1, 1, 1);
INSERT INTO designs VALUES (101, 2, 1, 1);
Resultado:
SELECT *
FROM designs
WHERE designID = 100
ORDER BY garmentID = 1 DESC,
colorID = 5 DESC,
sizeID = 10 DESC;
+----------+-----------+---------+--------+
| designID | garmentID | colorID | sizeID |
+----------+-----------+---------+--------+
| 100 | 1 | 5 | 10 |
| 100 | 1 | 5 | 3 |
| 100 | 1 | 5 | 15 |
| 100 | 1 | 1 | 1 |
| 100 | 1 | 2 | 2 |
| 100 | 1 | 8 | 20 |
| 100 | 2 | 5 | 10 |
| 100 | 2 | 6 | 15 |
+----------+-----------+---------+--------+
8 rows in set (0.02 sec)
Observe cómo la fila que coincide con el garmentID
especificado , colorID
y sizeID
es primero. En su defecto, las filas que coincidan con garmentID
y colorID
son los siguientes Luego, las filas que solo coinciden con garmentID
seguir. Luego el resto, que solo coincide con el designID
filtro del WHERE
cláusula.
Creo que vale la pena hacer esto en SQL. Como @Toby señaló en la otra respuesta
, en general, no necesita preocuparse por el rendimiento al ordenar un número tan pequeño de filas, suponiendo que siempre filtrará por designID
... En cuanto a su otra pregunta, no sé si existe un nombre para esa consulta; tiendo a llamarlo "ordenar por una expresión".