Как получить уникальные записи и порядок внешнего соединения с 3 таблицами? - PullRequest
0 голосов
/ 13 февраля 2012

У меня проблема с определенным порядком записей и уникальностью. У меня есть следующие настройки таблиц:

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 также не помогает получить правильный порядок.

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

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Вы почти на месте, но вам нужна агрегатная функция на order_index:

SELECT
person.person_id AS 'person.person_id',
person.name AS 'person.name',
MIN(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
person.person_id, person.name
ORDER BY
3 ASC, 2 ASC

Другими словами, если человек принадлежит к нескольким группам, вы не сможете избежать дубликатов, если не выберете, какую order_index сортировать, используя min, max, avg или sum.

0 голосов
/ 13 февраля 2012

Если человек входит в несколько групп, с ним будут связаны различные group.order_index. По какой вы хотите отсортировать человека? Вы можете просто выбрать один из них, то есть самый маленький или самый большой, но какой в ​​этом смысл? Кроме того, не будет ли неприятно видеть список людей, отсортированный по группам, когда группы не видны в списке? Тому, кто не знает, как отсортирован список, было бы трудно определить, какая логика сортировки была применена.

...