сложный Order By

Тема в разделе "SQL", создана пользователем Holger Dee Assuran, 10 фев 2009.

  1. Holger Dee Assuran

    Holger Dee Assuran Гость

    Есть в базе данных таблицы: "объект" и "человек". У каждого объекта есть "авторы" и "исполнители" (тип человека). Связи объектов и людей пишутся в одну таблицу с указанием типа человека. Она содержит три поля-указателя: объект, человек и его тип. Мне необходимо отсортировать объекты по имени человека определенного типа. Т.е. по имени автора или по имени исполнителя.
    Никак не могу понять, как ввести уточнение типа людей (obj_people.type) по которому нужно сортировать в запрос:
    Код (Text):
    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
     
  2. etc

    etc Гость

    Условия в where, сортировка в order by, в чем затруднения?
     
  3. Holger Dee Assuran

    Holger Dee Assuran Гость

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

    Собственно у меня есть мысль, но я не знаю сработает ли это так как мне нужно
    Код (Text):
    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
    Я знаю что можно задавать несколько столбцов сортировки, но можно ли задавать им значения? И какой результат вернет база?
     
  4. etc

    etc Гость

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

    Holger Dee Assuran Гость

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

    Aleksey Гость

    Только, если выбрать записи, где obj_people.type='author', а остальные не трогать:

    Код (Text):
    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;
     
  7. etc

    etc Гость

    тогда см. UNION или рядом
     
  8. Aleksey

    Aleksey Гость

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

    etc Гость

  10. Holger Dee Assuran

    Holger Dee Assuran Гость

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

    Aleksey Гость

    Такой синтаксис не поддерживается:
    Попробуйте с такой сортировкой ORDER BY obj_people.type, people.name - может понравится :(
     
  12. etc

    etc Гость

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

    Holger Dee Assuran Гость

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

    etc Гость

    У вас ошибка в 17 строке.
     
  15. Holger Dee Assuran

    Holger Dee Assuran Гость

    Не понял? В какой строке? Где вобще тут строки?

    Итак - сабж: выбрать из базы все записи объектов и отсортировать их либо по автору, либо по исполнителю. Связи объектов и людей хранятся в таблице связей вида: указатель объекта, указатель человека, тип человека.
    Решение:
    Код (Text):
    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, что я собственно и применил для уточнения по которому именно типу людей мне нужно сделать сортировку.

    Тема исчерпана.
     
  16. etc

    etc Гость

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

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

Поделиться этой страницей