powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос с объединением и сортировкой
20 сообщений из 20, страница 1 из 1
Запрос с объединением и сортировкой
    #38879146
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть две связанные таблицы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE `groups` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY `i_name` (`name`) USING BTREE
)

CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `id_group` int(11) unsigned NOT NULL,
  `name` varchar(50) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY `i_name` (`name`)
)


Нужно получить результат в виде списка: группа (отсортированы по названию), пользователи в ней (так же отсортированы по названию), след. группа + пользователи и т.д.
Запрос вида
Код: sql
1.
2.
3.
(SELECT name, 0 FROM groups ORDER BY name)
UNION
(SELECT name, 1 FROM users ORDER BY name)


дает результат в виде:
name0Group-30Группа-10Группа-20ug-11ug-21ug-2-21ug-31
а надо, чтобы было так:
name0Group-30ug-31Группа-10ug-11Группа-20ug-21ug-2-21
Как этого добиться? Помогите модифицировать запрос, пожалуйста!
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38879320
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT sq.name, CASE sq.id_group WHEN 0 THEN 0 ELSE sq.id_group END is_user
FROM (
  SELECT id,name,0 id_group FROM groups
  UNION
  SELECT id,name,id_group FROM users
  ) sq
ORDER BY CASE sq.id_group WHEN 0 THEN sq.id ELSE sq.id_group END, sq.id_group


?
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38880386
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
не то получается, к сожалению:
nameis_userГруппа-10ug-11Group-30ug-22ug-2-22Группа-20ug-33
Да, юзеры распределились по группам, но в Группа-2 попал юзер из Group-3, и наоборот. И нет сортировки по названиям (группы/юзеры).
Должно быть так:
nameis_userGroup-30ug-33Группа-10ug-11Группа-20ug-22ug-2-22
Что-то надо еще подшаманить...
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38880391
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, извнияюсь, чуть сам ошибся - юзеры распределились по группам как надо, вот результат Вашего запроса:
nameis_userГруппа-10ug-11Group-30ug-32Группа-20ug-23ug-2-23
Осталось только отсортировать по названиям, как?
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38880409
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, ну чё как дети-то? Неужели так трудно изменить условие сортировки, и в CASE сортировать не по идентификатору группы, а по её имени?
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38880414
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
ну естественно, попробовал изменить CASE. Но это не помогает. Нужно отсортировать как группы, так и юзеров внутри группы. И это не получается :(
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38880590
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYingну естественно, попробовал изменить CASE. Но это не помогает.Ну покажи, КАК изменял, и обоснуй, почему именно ТАК...
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38880641
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Попробовал сортировать по имени так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT sq.name, CASE sq.id_group WHEN 0 THEN 0 ELSE sq.id_group END is_user
FROM (
  SELECT id,name,0 id_group FROM groups
  UNION
  SELECT id,name,id_group FROM users
  ) sq
ORDER BY CASE sq.id_group WHEN 0 THEN sq.name ELSE sq.name END


но так просто сортируется по имени, что и правильно, т.к. имя не привязано к группе или пользователю. А вот как сортировать сразу и группы и юзеров внутри группы, не соображу...

Пробовал и так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT sq.gn,sq.un, CASE sq.id_group WHEN 0 THEN 0 ELSE sq.id_group END is_user
FROM (
  (SELECT id,name gn,'' un,0 id_group FROM groups)
  UNION
  (SELECT id,'',name,id_group FROM users)
  ) sq
ORDER BY CASE sq.id_group WHEN 0 THEN sq.gn ELSE sq.un END


но и тут не тот результат :(
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38880660
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYing
Код: sql
1.
CASE sq.id_group WHEN 0 THEN sq.name ELSE sq.name END


Ну тут даже и сказать-то нечего...

Вместо того, чтобы разобраться досконально и понять, почему я дал именно такое выражение сортировки, Вы пытаетесь без понимания сути, тупо, методом тыка, что-нибудь поменять - авось получится... а вот не получится.
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38880690
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
я разбирался - у вас сортировка сначал идет по условию "CASE sq.id_group WHEN 0 THEN sq.id ELSE sq.id_group END", затем по столбцу sq.id_group. Разве не так? Это выводит группы с их пользователями - да, но в хаотичном порядке.
Но какое еще вписать условие, чтобы сортировать сразу и группы и юзеров внутри группы - я не знаю, перепробовал уже десятки вариантов, не получается...
Может быть, вы не обращали внимания на подчеркнутое условие?
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38880879
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
до того уже доразбирался с вашим запросом, что совсем перестал понимать его работу, впору застрелиться... %)
Вот давайте посмотрим пошагово:
1) так выглядит результат запроса БЕЗ ORDER BY , зеленым выделен виртуальный столбец значений CASE;
2) это уже после ORDER BY CASE sq.id_group WHEN 0 THEN sq.id ELSE sq.id_group END , как бы понятно - произошла сортировка по возрастанию по зеленому столбцу CASE;
3) это после добавления сортировки по столбцу sq.id_group , кстати почему используется он, а не is_user ? Они ведь равны?

И вот эта последняя сортировка мне не понятна, как так последовательность значений 1 0 0 2 0 3 3 отсортировалась в 0 1 0 2 0 3 3 ??? Сорри, если туплю, но голова не варит уже :(
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38880921
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYingя разбирался - у вас сортировка сначал идет по условию "CASE sq.id_group WHEN 0 THEN sq.id ELSE sq.id_group END", затем по столбцу sq.id_group. Разве не так?Разобраться - это понять, не ЧТО, а ПОЧЕМУ ТАК.
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38880929
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

ну объясните, почему так?
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38881067
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaLiYingя разбирался - у вас сортировка сначал идет по условию "CASE sq.id_group WHEN 0 THEN sq.id ELSE sq.id_group END", затем по столбцу sq.id_group. Разве не так?Разобраться - это понять, не ЧТО, а ПОЧЕМУ ТАК.
ПОЧЕМУ ТАК - потому, что сначала создается виртуальный столбец, в котором и группа, и ее пользователи имеют один id. Сортировкой по нему получаем упорядоченный список групп и их пользователей. А следующей сортировкой по столбцу sq.id_group группа ставится в списке выше пользователя. Правильно объяснил?
Вопрос про сортировку по названиям остается открытым.
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38881151
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё правильно. Но на первом этапе не только записи собираются группы, но и эти группы сортируются в порядке возрастания идентификатора группы. Значит, нужно сортировать не по идентификатору, а по наименованию. Причём именно наименванию группы. А чтобы это можно было сделать, нужно, чтобы подзапрос отдавал такое поле - так что потребуется его модифицировать.
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38881333
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
изменил подзапрос, чтобы отдавал отдельно имена групп и пользователей. Добавил сортировку по имени группы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT sq.gn,sq.un, CASE sq.id_group WHEN 0 THEN 0 ELSE sq.id_group END is_user
FROM (
  SELECT id,name gn,null un,0 id_group FROM groups
  UNION
  SELECT id,null,name,id_group FROM users
  ) sq
ORDER BY 
  CASE sq.id_group WHEN 0 THEN sq.id ELSE sq.id_group END,
  sq.id_group,
  sq.gn


И ничего не поменялось, что я делаю не так?
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38881357
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaЗначит, нужно сортировать не по идентификатору, а по наименованию. Причём именно наименванию группы.
LiYing
Код: sql
1.
2.
ORDER BY 
  CASE sq.id_group WHEN 0 THEN sq.id ELSE sq.id_group END,

Ну и?..
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38881363
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,
c
Код: sql
1.
CASE sq.gn WHEN null THEN sq.un ELSE sq.gn END


получается вообще не то:
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38881510
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всё, помощь кончилась?
...
Рейтинг: 0 / 0
Запрос с объединением и сортировкой
    #38881629
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYing
Код: sql
1.
SELECT id,name gn,'' un,0 id_group FROM groups

отсортировать по имени группы, пронумеровать их в этом порядке , полученный номер назвать "ид". Соответственно для выборки из юзеров подставить полученный номер вместо парент_ид. А уже из полученных данных делать выборку как в 17262164 / 17270999 .
ЗЫ. А вообще это скорее задача для клиента :)
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос с объединением и сортировкой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]