сложный 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
 
E

etc

Условия в where, сортировка в order by, в чем затруднения?
 
H

Holger Dee Assuran

Затруднения в том, что оба человека (и автор и исполнитель) всегда присутствуют в связях объекта и у них одно и то-же поле имени. Таким образом сортировать по имени человека, будь то автор или исполнитель, всегда будем по 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
Я знаю что можно задавать несколько столбцов сортировки, но можно ли задавать им значения? И какой результат вернет база?
 
E

etc

я не пойму что вы хотите ... выбрать только по 'author' и сортировать это, или выбрать и то и то а сортировать только тех кто - 'author' ?
 
H

Holger Dee Assuran

Выбрать и то и то, а сортировать только по автору. Или только по исполнителю
 
A

Aleksey

Только, если выбрать записи, где 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;
 
A

Aleksey

А смысл UNION?
Прибавка к первому запросу юниона с данными, где obj_people.type='ispolnitel' - это тоже самое, что и отбор всех значений с сортировкой
ORDER BY obj_people.type, people.name :(
 
E

etc

вот тут говорят что нет
 
H

Holger Dee Assuran

А какое ваше мнение по поводу
Код:
order by people.name, obj_people.type='author' asc
?
 
E

etc

Что наше мнение по сравнению со спецификацией? - ничто :( ... мало ли чего нам хотится ...
 
H

Holger Dee Assuran

Код:
ORDER BY obj_people.type, people.name
Так в моем случае не пойдет. Просто я несколько упростил задачу здесь, на самом деле у меня больше типов людей, а этот способ решит эту задачу только если их два. Придется развести связи с разными типами людей по разным таблицам видимо.... А так хотелось сделать изящно - в одну таблицу :(
 
H

Holger Dee Assuran

У вас ошибка в 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, что я собственно и применил для уточнения по которому именно типу людей мне нужно сделать сортировку.

Тема исчерпана.
 
E

etc

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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!