Mysql упорядочить по иерархическому тексту, но сортировать как число? - PullRequest
0 голосов
/ 15 июля 2011

Да, название сбивает с толку, но я буду держать это простым. Представьте себе страницу с фотографией и на ней есть комментарии. Эти комментарии могут быть вложены, отвечая на них. Мне нужно найти правильный порядок сортировки для них.

Я храню эти иерархии, используя «родословную». Это текстовое, сплющенное значение позиции отдельного комментария в иерархии. Вот правильно отсортированная тема. Я только показываю столбец происхождения:

903
909
909-1404
1405

903 - первый комментарий, 909 - второй. 1404 является ответом на второй комментарий, и, наконец, 1405 является последним комментарием, без ответа. Вот как они должны быть отсортированы. Я изо всех сил пытаюсь достичь этого результата, хотя. Вот что я получу, если просто сделаю это:

ORDER BY lineage

1405
903
909
909-1404

Ошибка здесь в том, что 1405 должно быть внизу. Я знаю (+0) трюк, чтобы упорядочить текст, как это число:

ORDER BY (lineage + 0)

Что дает мне это:

903
909-1404
909
1405

На этот раз многопоточный комментарий (1404) неправильно отсортирован, он должен следовать за родителем (909).

Есть ли простой способ выполнить желаемую сортировку? Единственное, о чем я мог подумать, это заполнить идентификаторы комментариев нулями впереди, но это был бы невероятно болезненный процесс миграции, которого я отчаянно хочу избежать.

Ответы [ 2 ]

3 голосов
/ 15 июля 2011
ORDER BY CAST(REPLACE(lineage,"-",".") AS DOUBLE)

903
909
909.1404
1405

Но ваше «происхождение», возможно, не лучший способ хранения отношений между данными в реляционной базе данных ... возможно, стоит подумать о нормализации?

1 голос
/ 15 июля 2011

Дополните числа в строке нулями, чтобы вы могли правильно упорядочить их как строки.

Конечно, для правильного заполнения вам нужно знать максимальное число, которое вы хотите сохранить там.

Тамдругие способы хранения иерархических древовидных связей (родительские ссылки, вложенные древовидные наборы).Ваш подход имеет некоторые преимущества для конкретных задач, но, как вы можете видеть, также имеет свои ограничения.

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