Таблица упорядочения MySQL объединяет строки с одинаковым значением в поле, но поддерживает взаимный порядок - PullRequest
0 голосов
/ 06 июня 2019

У меня есть таблица MySQL, которую я хочу отсортировать на основе буквенно-цифрового поля, которое в некоторых случаях может перекрываться.Я пробовал несколько запросов, я всегда близко, но не достигаю цели.

Моя таблица:

TABLE
Sizes
COLUMN
ScaleCode   varchar(6)
SizeIndex   smallint(6) 
SizeName    varchar(30)
PRIMARY KEY
ScaleCode, SizeIndex

Данные:

+-----------+-----------+----------+
| ScaleCode | SizeIndex | SizeName |
+-----------+-----------+----------+
| 00001     | 1         | 13       |
| 00001     | 2         | 14       |
| 00001     | 3         | 15       |
| 00002     | 1         | 14       |
| 00002     | 2         | 15       |
| 00002     | 3         | 16       |
| 00002     | 4         | 17       |
| 00002     | 5         | 18       |
| 00002     | 6         | 19       |
| 00002     | 7         | 20       |
| 00003     | 1         | 18       |
| 00003     | 2         | 19       |
| 00003     | 3         | 20       |
| 00003     | 4         | 21       |
| 00003     | 5         | 22       |
| 00004     | 1         | ONE_SIZE |
| 00005     | 1         | 2S       |
| 00005     | 2         | S        |
| 00005     | 3         | M        |
| 00005     | 4         | L        |
| 00005     | 5         | 2L       |
+-----------+-----------+----------+

Моя цельвыполнить выбор для SizeName со следующим результатом:

+----------+
| SizeName |
+----------+
| ONE_SIZE |
| 2S       |
| S        |
| M        |
| L        |
| 2L       |
| 13       |
| 14       |
| 15       |
| 16       |
| 17       |
| 18       |
| 19       |
| 20       |
| 21       |
| 22       |
+----------+

Итак, мне нужно перекрывать значения SizeName, показанные только один раз, как, например, для 14 и 15, оба доступны в ScaleCode 00001 и 000002 или 18, 19, 20оба доступны в ScaleCode 00002 и 00003. Хитрость заключается в том, что значения SizeName являются буквенно-цифровыми, поэтому мне нужно поддерживать взаимный порядок внутри одного и того же кода масштаба, то есть «2S» и «2L» должны иметь одинаковый порядок с другими размерами ихсобственный масштаб, а не отсортированный по числу.

То, что я пробовал, это:

SELECT DISTINCT SizeName  
FROM Sizes 
ORDER BY SizeName, ScaleCode, SizeIndex

, но:

+----------+
| SizeName |
+----------+
| 2L       |
| 2S       |
| 13       |
| 14       |
| 15       |
| 16       |
| 17       |
| 18       |
| 19       |
| 20       |
| 21       |
| 22       |
| L        |
| M        |
| ONE_SIZE |
| S        |
+----------+

Это не то, что я ожидал, потому что порядок внутри ScaleCode00005 не поддерживается.Итак, я попробовал:

SELECT DISTINCT SizeName  
FROM Sizes 
ORDER BY SizeName + 0, ScaleCode, SizeIndex

но:

+----------+
| SizeName |
+----------+
| S        |
| M        |
| L        |
| ONE_SIZE |
| 2L       |
| 2S       |
| 13       |
| 14       |
| 15       |
| 16       |
| 17       |
| 18       |
| 19       |
| 20       |
| 21       |
| 22       |
+----------+

Что было бы хорошо, если бы только «2L» и «2S» не могли считаться числом.

ОБНОВЛЕНИЕ: ONE_SIZE может быть везде, но не внутри других масштабов.Таким образом, это может быть до или после шкалы «2S, S, M, L, 2L», но не между ними.Мне нужно поддерживать постоянную шкалу.

Заранее спасибо всем, кто хочет мне помочь.

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Сначала вам нужно сделать «GROUP BY SizeName» с «MIN ()» вокруг «ScaleCode» и «ScaleIndex».После этого вы можете заказать его правильно

0 голосов
/ 06 июня 2019

Возможно, это немного сложно, но я прихожу к этому решению:

SELECT sz.SizeName FROM
(SELECT DISTINCT IF(
  (SELECT COUNT(p1.SizeName)
   FROM Sizes p1
   WHERE p1.SizeName NOT REGEXP '^[0-9]+[\\.\\,]?[0-9]*$' AND p1.SizeName = pt.SizeName) >
  (SELECT COUNT(p2.SizeName)
   FROM Sizes p2
   WHERE p2.SizeName REGEXP '^[0-9]+[\\.\\,]?[0-9]*$' AND p2.SizeName = pt.SizeName),
   CONCAT('text', pt.SizeName), pt.SizeName) AS sortable, pt.SizeName 
FROM Sizes pt) AS sz

Результат:

+----------+
| SizeName |
+----------+
| 13       |
| 14       |
| 15       |
| 16       |
| 17       |
| 18       |
| 19       |
| 20       |
| 21       |
| 22       |
| ONE_SIZE |
| 2S       |
| S        |
| M        |
| L        |
| 2L       |
+----------|

Таким образом, я могу поддерживать взаимный порядок и объединять перекрывающиеся размеры. Я знаю, что это не так элегантно, ма, это лучшее решение, которое я могу найти, пока не узнаю. Комментарии или другие ответы приветствуются.

...