2016-06-02 5 views
0

Таблица один - WorkOrderВыберите несколько данных из другой таблицы для каждого идентификатора через запятую

╔══════════╦══════════════╦══════════════╗ 
║ id  ║ wpeople ║ start_date ║ 
╠══════════╬══════════════╬══════════════╣ 
║ 1  ║ 1,2,4  ║ 02.08.2016 ║ 
║ 2  ║ 4,5   ║ 28.09.2016 ║ 
╚══════════╩══════════════╩══════════════╝ 

Таблица два - сотрудники

╔══════════╦═════════════════╗ 
║ id  ║ name   ║ 
╠══════════╬═════════════════╣ 
║ 1  ║ John   ║ 
║ 2  ║ Ben    ║ 
║ 3  ║ Ian    ║ 
║ 4  ║ Hank   ║ 
║ 5  ║ George   ║ 
╚══════════╩═════════════════╝ 

выбор выхода для тех, кто должен работать над проектом

╔══════════╦════════════════╦════════════╗ 
║ 1  ║ John,Ben,Hank ║ 02.08.2016 ║ 
║ 2  ║ Hank,George ║ 28.09.2016 ║ 
╚══════════╩════════════════╩════════════╝ 

Я пробовал с GROUP_CONCAT и FIND_IN_SET

SELECT w.id, 
     GROUP_CONCAT(e.name ORDER BY e.id) workorder 
FROM workorder w 
     INNER JOIN employees e 
      ON FIND_IN_SET(e.id, a.wpeople) > 0 
GROUP BY w.id 

Но выход это

╔══════════╦════════════════╦════════════╗ 
║ 1  ║ John   ║ 02.08.2016 ║ 
║ 1  ║ Ben   ║ 02.08.2016 ║ 
║ 1  ║ Hank   ║ 02.08.2016 ║ 
║ 2  ║ Hank   ║ 28.09.2016 ║ 
║ 2  ║ George   ║ 28.09.2016 ║ 
╚══════════╩════════════════╩════════════╝ 

Я поиск по Google для этого и решение это GROUP_CONCAT - FIND_IN_SET. Может быть, я не очень хорошо понял эту функцию.

Спасибо вам за внимание! Стефан

+0

У вас нет алиаса 'a' в любом случае, поэтому запрос будет синтаксической ошибкой с плавающей точкой' a.wpeople' не будет существовать. И почему вы не нормализировали свои таблицы от выхода? Сохранение нескольких значений данных во втором поле почти является признаком плохой конструкции. find_in_set() очень неэффективен, так как индексы не могут использоваться. –

+0

Как уже было сказано выше, вам необходимо денормализовать эти данные. Тем не менее, форматирование вывода, как это, лучше всего оставить на слое представления, а не на слое данных. Что вы используете для отображения данных? Веб-страница? Приложение? – mrunion

+0

@ Marc Мой плохой, я забыл ... изменить его, в моем коде это a и b, здесь я сделал изменение e от сотрудников и b создал рабочий порядок @mrunion Я использую этот запрос SQL для приложение, используемое для администрирования рабочих мест для работодателей и в конце для отправки электронной почты, чтобы сообщить им ... – zmeutz

ответ

0

Для тех, кто будет нуждаться в этом: я добавил новую таблицу werkbon_employee

╔══════════╦═══════════════════╦═══════════════╗ 
║ id  ║ workorder_id ║ employee_id ║ 
╠══════════╬═══════════════════╬═══════════════╣ 
║ 1  ║ 1     ║ 1   ║ 
║ 2  ║ 1     ║ 2   ║ 
║ 3  ║ 1     ║ 4   ║ 
║ 4  ║ 2     ║ 4   ║ 
║ 5  ║ 2     ║ 5   ║ 
╚══════════╩═══════════════════╩═══════════════╝ 

Я использовал, чтобы выбрать

SELECT *, 
     GROUP_CONCAT(e.name ORDER BY e.id) ename 
FROM werkbon 
     LEFT JOIN werkbon_employee we ON werkbon.id = we.werkbon_id 
     INNER JOIN employees e ON FIND_IN_SET(e.id, we.employee_id) > 0 
GROUP BY werkbon.id DESC LIMIT 1 

Теперь результат это

Werk mensen 
John,Ben,Hank 

Datum 
02.08.2016 

Спасибо на @MarcB за помощью

 Смежные вопросы

  • Нет связанных вопросов^_^