У меня проблема с определенным порядком записей и уникальностью. У меня есть следующие настройки таблиц:
person
groups
group_has_person
Идея в том, чтобы сортировать людей по группам. (подумайте о кругах Google+)
Сначала у меня была только личная таблица с двумя полями ID, связанными с записями группы, но затем я всегда ограничивался наличием человека только в 2 группах. Теперь я добавил таблицу связывания, чтобы человек мог быть помещен в неограниченное количество групп. Каждая группа имеет поле индекса сортировки (group.order_index
). Это целое число, определяющее порядок сортировки групп. Идея состоит в том, чтобы показать всех людей, сгруппированных по группам и показывающих каждого человека только один раз, но также по порядку не по имени или идентификатору, а по дополнительному полю индекса группы. Так что на самом деле я хочу показать всем людям, даже если они не в группе. Но когда они входят в одну или несколько групп, я хочу показать их в порядке group.order_index
и только один раз.
Результат запроса должен выглядеть следующим образом:
person.name person.person_id group.group_id group.order_index
Rick 1 1 1
Tom 2 1 1
Jan 4 3 2
Kees 3 3 2
Piet 5 NULL NULL
Обратите внимание, что group_id
- это не столбец для упорядочения, но в этой таблице есть дополнительное поле, поэтому порядок можно изменить после создания группы.
Я получил несколько запросов, которые приблизились к моему ожидаемому результату, но я еще не пришел:
Этот следующий запрос дает ожидаемый результат сортировки, но он все еще дает человеку несколько раз, когда он находится в нескольких группах:
SELECT
person.person_id AS 'person.person_id',
person.name AS 'person.name',
group.order_index AS 'group.order_index',
FROM
`person`
LEFT OUTER JOIN `group_has_person` ON person.person_id = group_has_person.person_id
LEFT OUTER JOIN `group` ON group_has_person.group_id = group.group_id
ORDER BY
3 ASC ,
2 ASC
Ключевое слово DISTINCT
тоже не помогло.
Следующий запрос дает уникальных лиц, но order by group_order_index
не работает и даже показывает ошибочные числа:
SELECT
person.person_id AS 'person.person_id',
person.name AS 'person.name',
group.order_index AS 'group.order_index',
FROM
`person`
LEFT OUTER JOIN `group_has_person` ON person.person_id = group_has_person.person_id
LEFT OUTER JOIN `group` ON group_has_person.group_id = group.workgroup_id
GROUP BY
group_has_person.person_id
ORDER BY
3 ASC ,
2 ASC
Группировка по person.person_id
также не помогает получить правильный порядок.
Внутренние объединения также не работают, потому что они не показывают людей, которых нет в группе. Можно ли получить то, что я хочу, без кода и только с помощью запроса без подвыборов?