У меня есть запрос 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
Моя проблема заключается в том, что в первой строке моих записей делегат столбца имеет слишком много результатов, как ожидалось :(. Но для другой строки все в порядке. Я не знаю, что это за ошибка, и я не знаю, как ее решить.
У кого-то есть идея? Если да, то было бы здорово! Заранее спасибо !
Условие предложения WHERE заставляет левое соединение p2p_user_group возвращать результат внутреннего соединения. Переместите это условие в предложение ON, чтобы получить истинный результат левого соединения.
Что вы имеете в виду, чтобы переместить мое предложение where? Потому что мне нужно, чтобы он принял делегата в group_id 3 и 10.
@Arendelle таким образом (затем удалите предложение WHERE): оставьте соединение velux.p2p_user_group на p2p_user_group.user_id = user.id И p2p_user_group.group_id в (10, 3)
Вы используете GROUP BY недопустимым способом .. psce.com/en/blog/2012/05/15/… .. Общее правило о правиле GROUP BY - это столбцы, которые вы выбираете, также должны быть в GROUP BY ... MySQL в более низких версиях имеет менее строгие правила использования GROUP BY, если только only_full_group_by как sql_mode включен.
@Aurelien Я пробую ваше решение, но, к сожалению, для каждой строки слишком много делегатов, которых я ожидал. Это как моя первая проблема, но теперь для всего перекодирования.
@RaymondNijland Я не понимаю, потому что я поставил идентификатор, который является самым важным
@Arendelle, это не было решением вашей проблемы, это была просто логическая проблема с вашим запросом
@Aurelien Я вижу, но не знаю, как с этой логикой получить делегата, которого я хочу.
@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)
И я возвращаюсь к своей первой проблеме. Я имею в виду, что первая запись показывает мне всю делегацию, которую я ожидал, а с остальным все в порядке
Наконец-то я нашел решение! И ты имеешь право! Я просто меняю эту строку: LEFT JOIN velux.professionnal_competence pc ON pc.professionnal_id = pro.id
во INNER JOIN, и она работает :). Спасибо за помощь!
У вас много соединений, это может быть проблема с данными. Я попробую удалить некоторые из объединений (или начну только с первой таблицы) и медленно добавлю объединения, чтобы проверить, где начинают появляться ваши дубликаты. Затем, если это связано с определенным соединением, проверьте данные в этой таблице, чтобы убедиться, что это проблема с данными.