Существует ли метод SQL для упорядочивания путем соответствия нескольким критериям?

У меня есть несколько таблиц, которые Объединены для формирования таблицы со столбцами

designID
garmentID
colorID
sizeID
imageID

У меня есть функция, которая похожа на это [переменные в квадратных скобках дополнительные]:

getProductImages($designID, [$garmentID], [$colorID], [$sizeID]);

Я хочу, чтобы это возвратило все imageIDs, которые соответствуют $designID в следующем порядке:

  • Строки, которые соответствуют $garmentID, $colorID и $sizeID сначала
  • Строки, которые соответствуют $garmentID и $colorID затем
  • Строки, которые соответствуют просто $garmentID затем
  • Строки, которые не соответствуют ни одному (просто $designID) в последний раз

Я мог сделать это довольно легко, просто загрузив все строки, которые соответствуют $designID и затем сортировке их в PHP, но мое понимание - то, что это обычно быстрее, чтобы сделать сортировку в MySQL, если это возможно. Будет приблизительно 20 строк, соответствующих данному $designID.

Таким образом, мой вопрос является двукратным: действительно ли стоит сделать сортировку в SQL-операторе? Если я делаю, что должен взять лучший подход?

Мне также очень было бы интересно знать, существует ли название этого вида сортировки.

5
задан Robert 1 July 2010 в 22:33
поделиться

2 ответа

Если я правильно понял, похоже, что вы можете использовать выражения в вашем 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... Что касается вашего другого вопроса, я не знаю, есть ли название для такого запроса - я обычно называю его "упорядочивание по выражению".

8
ответ дан 13 December 2019 в 22:01
поделиться

Это интересная проблема, и чтение ответа Дэниела научило меня кое-чему (сложному), которого я не знал о SQL.

Однако,

Если у вас будет всего 20 таких проектов, в действительности сортировка будет такой же быстрой в php или MySQL. Часто, если вы не имеете дело с 1000 или миллионами строк, скорость не является проблемой.

2
ответ дан 13 December 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: