Проблема с порядком SQL по запросу

#mysql #sql #sql-order-by

#mysql #sql #sql-order-by

Вопрос:

У меня есть таблица со следующим набором данных

 id   name  parent  
------------------
1    xyz   NULL  
2    def   NULL  
3    mno   abc  
4    abc   NULL  
5    pqr   abc  
6    qfx   def
  

Я хотел бы получить данные в следующем порядке:

 1    abc   NULL  
3    mno   abc  
5    pqr   abc  
2    def   NULL  
6    qfx   def  
4    xyz   NULL
  

Я имею в виду, что упорядочение должно происходить по имени пользователя, но записи с одним и тем же родителем должны отображаться вместе и чуть ниже записи для родителя.

Я использую MySQL.

Ответ №1:

попробуйте этот новый ответ:

 SELECT * 
FROM table t
ORDER BY
    CONCAT(parent, name)
  

он объединил две строки, поэтому порядок должен быть таким:

 abc
abcmno
abcpqr
def
defqfx
xyz
  

Комментарии:

1. Проблема в том, что при заказе предполагается, что ‘name’ в алфавитном порядке больше, чем ‘parent’. Если имя меньше, сортировка происходит не так, как ожидалось.

2. Я предполагаю, что вы имели в виду имя, а не идентификатор.

Ответ №2:

Что-то вроде этого (не обязательно точно подобное этому):

 SELECT *
FROM atable
ORDER BY COALESCE(CONCAT(parent, '.'), '')   name
  

Я бы на самом деле попытался заменить '.' символом, который вряд ли появится в именах.

Ответ №3:

Используйте приведенный ниже запрос:

 Select * from table_name
    Order by
        name, parent;
  

Ответ №4:

это вообще не проблема? поймай это:

 select * from mytable order by parent, name
  

Ответ №5:

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

Наиболее очевидным было бы

 select username, parent from mytable
order by parent,username
group by parent
  

Но это все равно сначала сортирует его по родительскому элементу.

Я уверен, что можно получить именно то, что вы хотели, но у меня еще не было caffine, чтобы выработать простое полное решение.

Ответ №6:

Другое в Oracle я счел необходимым написать хранимый процесс для выполнения иерархического упорядочения. Некоторые СУБД предлагают CTE (общие табличные выражения), которые могут давать тот же результат. Я не знаком с MySQL и не знаю, какая у него поддержка, но может помочь следующее.

Статья в Википедии

Специфичный для MySQL

Также погуглите «Деревья и иерархии Джо Селко»