Se entendi corretamente, parece que você pode usar expressões em seu
ORDER BY
, de maneira semelhante à resposta aceita dada à seguinte postagem do Stack Overflow:Portanto, sua consulta pode ficar assim:
SELECT imageID
FROM ...
JOIN ...
WHERE designID = 100
ORDER BY garmentID = 1 DESC,
colorID = 5 DESC,
sizeID = 10 DESC;
Observe que
garmentID
, colorID
e sizeID
não são usados como filtros no WHERE
cláusula. Os valores são usados apenas no ORDER BY
expressões. Caso de teste:
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 como a linha que corresponde ao
garmentID
especificado , colorID
e sizeID
é primeiro. Caso contrário, as linhas que correspondem a garmentID
e colorID
são os próximos. Em seguida, as linhas que correspondem apenas a garmentID
Segue. Em seguida, o resto, que corresponde apenas ao designID
filtro do WHERE
cláusula. Acredito que vale a pena fazer isso em SQL. Como @Toby anotado na outra resposta , em geral, você não precisa se preocupar com o desempenho ao classificar um número tão pequeno de linhas, supondo que sempre estará filtrando por
designID
... Quanto à sua outra pergunta, não sei se existe um nome para essa consulta - costumo chamá-la de "ordenar por uma expressão".