сложный Order By

  • Автор темы Автор темы Holger Dee Assuran
  • Дата начала Дата начала
H

Holger Dee Assuran

Есть в базе данных таблицы: "объект" и "человек". У каждого объекта есть "авторы" и "исполнители" (тип человека). Связи объектов и людей пишутся в одну таблицу с указанием типа человека. Она содержит три поля-указателя: объект, человек и его тип. Мне необходимо отсортировать объекты по имени человека определенного типа. Т.е. по имени автора или по имени исполнителя.
Никак не могу понять, как ввести уточнение типа людей (obj_people.type) по которому нужно сортировать в запрос:
Код:
select object.id from `object`, `people`, `obj_people` where obj_people.obj_id=object.id and obj_people.people_id=people.id order by people.name asc

Забыл сказать - использую MySQL5
 
Условия в where, сортировка в order by, в чем затруднения?
 
Затруднения в том, что оба человека (и автор и исполнитель) всегда присутствуют в связях объекта и у них одно и то-же поле имени. Таким образом сортировать по имени человека, будь то автор или исполнитель, всегда будем по people.name. А мне нужно отсортировать лишь по одному из них - либо по автору, либо по исполнителю. И отличаются они друг от друга меткой в таблице связей obJ_people.type

Собственно у меня есть мысль, но я не знаю сработает ли это так как мне нужно
Код:
select object.id from `object`, `people`, `obj_people` where obj_people.obj_id=object.id and obj_people.people_id=people.id order by people.name, obj_people.type='author' asc
Я знаю что можно задавать несколько столбцов сортировки, но можно ли задавать им значения? И какой результат вернет база?
 
я не пойму что вы хотите ... выбрать только по 'author' и сортировать это, или выбрать и то и то а сортировать только тех кто - 'author' ?
 
Выбрать и то и то, а сортировать только по автору. Или только по исполнителю
 
Только, если выбрать записи, где obj_people.type='author', а остальные не трогать:

Код:
SELECT object.id 
FROM `object`, `people`, `obj_people` 
WHERE obj_people.obj_id=object.id 
AND obj_people.people_id=people.id 
AND obj_people.type='author'			 -- Здесь доп. условие
ORDER BY people.name ASC;
 
тогда см. UNION или рядом
 
А смысл UNION?
Прибавка к первому запросу юниона с данными, где obj_people.type='ispolnitel' - это тоже самое, что и отбор всех значений с сортировкой
ORDER BY obj_people.type, people.name :(
 
А какое ваше мнение по поводу
Код:
order by people.name, obj_people.type='author' asc
?
 
Что наше мнение по сравнению со спецификацией? - ничто :( ... мало ли чего нам хотится ...
 
Код:
ORDER BY obj_people.type, people.name
Так в моем случае не пойдет. Просто я несколько упростил задачу здесь, на самом деле у меня больше типов людей, а этот способ решит эту задачу только если их два. Придется развести связи с разными типами людей по разным таблицам видимо.... А так хотелось сделать изящно - в одну таблицу :(
 
У вас ошибка в 17 строке.
 
У вас ошибка в 17 строке.
Не понял? В какой строке? Где вобще тут строки?

Итак - сабж: выбрать из базы все записи объектов и отсортировать их либо по автору, либо по исполнителю. Связи объектов и людей хранятся в таблице связей вида: указатель объекта, указатель человека, тип человека.
Решение:
Код:
select object.id from `object`, `people`, `obj_people` where obj_people.obj_id=object.id and obj_people.people_id=people.id order by (select people.name from `people`, `obj_people` where people.id=obj_people.people_id and obj_people.obj_id=object.id and obj_people.type='author') asc
MySQL позволяет использовать подзапросы (вложенные запросы) в конструкции ORDER BY, что я собственно и применил для уточнения по которому именно типу людей мне нужно сделать сортировку.

Тема исчерпана.
 
Не понял? В какой строке? Где вобще тут строки?
Вот и мы не поняли, вы отредактировали свое сообщение, и моя фраза потеряла актуальность ...

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

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab