Почему group_concat возвращает тоже запись для первой строки?

У меня есть запрос sql, и в нем я использую функцию GROUP_CONCAT. Я использую это, чтобы иметь список делегатов в каждой строке.

Это моя просьба:

SELECT pro.company, pro.title AS person_title, pro.name AS person_name, pro.firstname AS person_firstname, pro.address, pro.address2, pro.postcode, cities.name AS city, pro.phone, pro.gsm, pro.fax, pro.email, pro.client_number AS sap, GROUP_CONCAT( DISTINCT user.firstname, ' ', user.name SEPARATOR ', ') AS delegue, agency.name AS agency, CONCAT(drv.firstname, ' ', drv.name) AS drv_name, drv.email AS drv_email, GROUP_CONCAT(DISTINCT pc.competence_id SEPARATOR ',') AS competences
    FROM velux.professionnal pro
    INNER JOIN velux.cities ON cities.id = pro.city_id
    INNER JOIN velux.zone ON pro.postcode BETWEEN zone.postcode_start AND postcode_end
    LEFT JOIN velux.p2p_user_zones user_zones ON user_zones.zone_id = zone.id
    LEFT JOIN velux.p2p_user user ON user.id = user_zones.user_id
    left join velux.p2p_user_group on p2p_user_group.user_id = user.id
    LEFT JOIN velux.agency ON zone.agency_id = agency.id
    LEFT JOIN velux.p2p_user drv ON drv.id = agency.user_id
    LEFT JOIN velux.professionnal_competence pc ON pc.professionnal_id = pro.id
    WHERE p2p_user_group.group_id in (10, 3)
    GROUP BY pc.professionnal_id 

Моя проблема заключается в том, что в первой строке моих записей делегат столбца имеет слишком много результатов, как ожидалось :(. Но для другой строки все в порядке. Я не знаю, что это за ошибка, и я не знаю, как ее решить.

У кого-то есть идея? Если да, то было бы здорово! Заранее спасибо !

У вас много соединений, это может быть проблема с данными. Я попробую удалить некоторые из объединений (или начну только с первой таблицы) и медленно добавлю объединения, чтобы проверить, где начинают появляться ваши дубликаты. Затем, если это связано с определенным соединением, проверьте данные в этой таблице, чтобы убедиться, что это проблема с данными.

Brad 02.05.2018 16:11

Условие предложения WHERE заставляет левое соединение p2p_user_group возвращать результат внутреннего соединения. Переместите это условие в предложение ON, чтобы получить истинный результат левого соединения.

jarlh 02.05.2018 16:11

Что вы имеете в виду, чтобы переместить мое предложение where? Потому что мне нужно, чтобы он принял делегата в group_id 3 и 10.

Arendelle 02.05.2018 16:14

@Arendelle таким образом (затем удалите предложение WHERE): оставьте соединение velux.p2p_user_group на p2p_user_group.user_id = user.id И p2p_user_group.group_id в (10, 3)

Aurelien 02.05.2018 16:21

Вы используете GROUP BY недопустимым способом .. psce.com/en/blog/2012/05/15/… .. Общее правило о правиле GROUP BY - это столбцы, которые вы выбираете, также должны быть в GROUP BY ... MySQL в более низких версиях имеет менее строгие правила использования GROUP BY, если только only_full_group_by как sql_mode включен.

Raymond Nijland 02.05.2018 16:22

@Aurelien Я пробую ваше решение, но, к сожалению, для каждой строки слишком много делегатов, которых я ожидал. Это как моя первая проблема, но теперь для всего перекодирования.

Arendelle 03.05.2018 09:49

@RaymondNijland Я не понимаю, потому что я поставил идентификатор, который является самым важным

Arendelle 03.05.2018 09:49

@Arendelle, это не было решением вашей проблемы, это была просто логическая проблема с вашим запросом

Aurelien 03.05.2018 09:51

@Aurelien Я вижу, но не знаю, как с этой логикой получить делегата, которого я хочу.

Arendelle 03.05.2018 09:58

@Aurelien Oh И я меняю строку, наконец, я удаляю "left" на левом соединении вот так (я сохраняю ваше предложение): join velux.p2p_user_group on p2p_user_group.user_id = user.id AND (p2p_user_group.group_id =10 OR p2p_user_group.group_id =3) И я возвращаюсь к своей первой проблеме. Я имею в виду, что первая запись показывает мне всю делегацию, которую я ожидал, а с остальным все в порядке

Arendelle 03.05.2018 10:09

Наконец-то я нашел решение! И ты имеешь право! Я просто меняю эту строку: LEFT JOIN velux.professionnal_competence pc ON pc.professionnal_id = pro.id во INNER JOIN, и она работает :). Спасибо за помощь!

Arendelle 03.05.2018 15:10
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
11
43
0

Другие вопросы по теме