Упорядочивание с помощью Group_Concat, доказывающее сложность

#php #mysql #arrays #group-concat

#php #mysql #массивы #group-concat

Вопрос:

Я несколько новичок в php / mysql, поэтому уверен, что чего-то не хватает. Этот подход, вероятно, тоже не самый лучший.

У меня есть следующие таблицы

Таблица: поля unit_members: id, unit_id, person_id, primary

Таблица: поля persons: id, name, rank_id

Таблица: ранжирование полей: идентификатор, имя, ранг

Таблица: поля единиц измерения: идентификатор, имя, ранг

Я пытаюсь отобразить каждое подразделение и людей в каждом подразделении и отсортировать людей по рангу, который является полем int. Это кажется простым, но я не могу упорядочить людей по rank.rank.

Вот мой запрос:

 'SELECT unit_members.person_id, GROUP_CONCAT(persons.id) as personid, 
        GROUP_CONCAT(persons.name) as name, persons.rank_id, unit_members.unit_id, 
        units.id as unitid, units.name as unit, 
        GROUP_CONCAT(DISTINCT units.codename) as squad, ranks.id as rankid, 
        GROUP_CONCAT(ranks.rank) as rankrank 
FROM unit_members, ranks, persons, units
where persons.rank_id = ranks.id 
  and units.id = unit_members.unit_id 
  and persons.id = unit_members.person_id
group by units.codename
ORDER BY units.rank asc, ranks.rank asc';
  

Мне кажется, что порядок здесь не влияет на Group_Concat, поэтому я предполагаю, что мне нужно каким-то образом упорядочить Group_Concat, прежде чем он перейдет в массив. Массив, похоже, упорядочивает его по идентификатору пользователя.

Любая помощь была бы высоко оценена. Заранее спасибо.

Комментарии:

1. Используйте кнопку {} для форматирования кода.

Ответ №1:

Я думаю, у вас просто некоторые неправильные представления.

Ваше ORDER BY решение не повлияет на результаты GROUP_CONCAT() . Вы можете изменить порядок результатов в GROUP_CONCAT() функции, указав порядок в скобках.

В нынешнем виде ваш запрос будет группироваться по unit.codename, и внутри каждого unit.codename произвольные результаты будут отсортированы сначала по units.rank, а затем по ranges.rank .

Большая проблема: вы продолжаете говорить о массиве. Здесь нет массива.

Комментарии:

1. Спасибо за ваш ответ. Я попробую это позже вечером. Когда я упоминаю массив, я забыл упомянуть, что я делал с GROUP_CONCAT, я добавляю следующее через некоторое время: $name = $row[‘name’]; $members_array = explode(«,», $name); поэтому я могу легко поместить содержимое этого GROUP_CONCAT в список. Не уверен, что это лучший способ сделать это.

2. На самом деле у меня была возможность попробовать это раньше, но это не сработало. Что я сделал не так? ‘code’ $roster_query = ‘ВЫБЕРИТЕ unit_members.person_id, GROUP_CONCAT(persons.id УПОРЯДОЧИВАНИЕ по рангам. ранжируйте desc) как personid, GROUP_CONCAT(persons.name УПОРЯДОЧИВАНИЕ по рангам. ранжируйте desc) как имя, … ‘код’ и т. Д

3. Отредактируйте свой вопрос, чтобы включить некоторые примеры данных и ожидаемый результат. Вам нужно будет предоставить небольшие образцы данных для каждой из четырех таблиц.