У меня есть несколько таблиц, которые Объединены для формирования таблицы со столбцами
designID
garmentID
colorID
sizeID
imageID
У меня есть функция, которая похожа на это [переменные в квадратных скобках дополнительные]:
getProductImages($designID, [$garmentID], [$colorID], [$sizeID]);
Я хочу, чтобы это возвратило все imageIDs, которые соответствуют $designID в следующем порядке:
Я мог сделать это довольно легко, просто загрузив все строки, которые соответствуют $designID и затем сортировке их в PHP, но мое понимание - то, что это обычно быстрее, чтобы сделать сортировку в MySQL, если это возможно. Будет приблизительно 20 строк, соответствующих данному $designID.
Таким образом, мой вопрос является двукратным: действительно ли стоит сделать сортировку в SQL-операторе? Если я делаю, что должен взять лучший подход?
Мне также очень было бы интересно знать, существует ли название этого вида сортировки.
Если я правильно понял, похоже, что вы можете использовать выражения в вашем ORDER BY
, подобно принятому ответу на следующее сообщение Stack Overflow:
Поэтому ваш запрос может выглядеть следующим образом:
SELECT imageID
FROM ...
JOIN ...
WHERE designID = 100
ORDER BY garmentID = 1 DESC,
colorID = 5 DESC,
sizeID = 10 DESC;
Обратите внимание, что garmentID
, colorID
и sizeID
не используются в качестве фильтров в предложении WHERE
. Эти значения используются только в выражениях ORDER BY
.
Тестовый пример:
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);
Результат:
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)
Обратите внимание, что строка, которая соответствует указанным garmentID
, colorID
и sizeID
, является первой. Если этого не произошло, то следующими будут строки, соответствующие garmentID
и colorID
. Затем следуют строки, в которых совпадает только garmentID
. Затем остальные, которые соответствуют только фильтру designID
пункта WHERE
.
Я считаю, что это стоит делать в SQL. Как отметил @Toby в другом ответе, в целом вам не стоит беспокоиться о производительности при сортировке такого небольшого количества строк, предполагая, что вы всегда будете фильтровать по designID
... Что касается вашего другого вопроса, я не знаю, есть ли название для такого запроса - я обычно называю его "упорядочивание по выражению".
Это интересная проблема, и чтение ответа Дэниела научило меня кое-чему (сложному), которого я не знал о SQL.
Однако,
Если у вас будет всего 20 таких проектов, в действительности сортировка будет такой же быстрой в php или MySQL. Часто, если вы не имеете дело с 1000 или миллионами строк, скорость не является проблемой.