Существует ли методика SQL для упорядочения по нескольким критериям? - PullRequest
5 голосов
/ 02 июля 2010

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

designID
garmentID
colorID
sizeID
imageID

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

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

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

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 02 июля 2010

Если я правильно понял, похоже, что вы можете использовать выражения в вашем ORDER BY, способом, аналогичным принятому ответу на следующий пост переполнения стека:

Следовательно, ваш запрос может выглядеть так:

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. Как заметил @ Тоби в другом ответе , в общем случае вам не нужно беспокоиться о производительности при сортировке такого небольшого количества строк, при условии, что вы всегда будете фильтровать по designID ... Что касается Ваш другой вопрос, я не знаю, есть ли название для такого запроса - я склонен называть это «упорядочением по выражению».

2 голосов
/ 02 июля 2010

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

Однако,

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...