MySQL объединяет два запроса - PullRequest
0 голосов
/ 27 октября 2009

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

Таблица филиалов:

...
manager_id
sales_manager_id
admin_manager_id
...

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

для усложнения вещей у меня также есть таблица branch_extra:

branches_extra:

id
branch_id
user_id
position_id

, который содержит внешние ключи user_id, branch_id для дополнительных сотрудников, которые будут отображаться на странице контактов филиалов на веб-сайте. Проблема в том, что пользователи иногда отображаются более одного раза, потому что они могут иметь несколько позиций / ролей, в настоящее время у меня есть 2 запроса, которые я использую, чтобы вернуть менеджеров, указанных в таблице филиалов, а затем дополнительный персонал в таблице branch_extra:

SELECT CONCAT( xoops_users_extra.first_name, ' ', xoops_users_extra.last_name ) AS full_name, , xoops_users_extra.profile_image_thumb, xoops_users.email,
            CASE xoops_users_extra.main_userid
                WHEN branches.manager_id THEN 'Manager'
                WHEN branches.sales_manager_id  THEN 'Sales Manager'
                WHEN branches.admin_manager_id  THEN 'Admin Manager'
                WHEN branches.ops_manager_id  THEN 'Ops Manager'
                WHEN branches.export_manager_id  THEN 'Export Manager'
                WHEN branches.import_manager_id  THEN 'Import Manager'
            END AS position,
            CASE xoops_users_extra.main_userid
                WHEN branches.manager_id THEN 1
                WHEN branches.sales_manager_id  THEN 2
                WHEN branches.admin_manager_id  THEN 3
                WHEN branches.ops_manager_id  THEN 4
                WHEN branches.export_manager_id  THEN 5
                WHEN branches.import_manager_id  THEN 6
            END AS sort_order
        FROM (branches, xoops_users_extra, xoops_users)
        WHERE ((branches.manager_id = xoops_users_extra.main_userid)
            OR (branches.sales_manager_id = xoops_users_extra.main_userid)
            OR (branches.admin_manager_id = xoops_users_extra.main_userid)
            OR (branches.ops_manager_id = xoops_users_extra.main_userid)
            OR (branches.export_manager_id = xoops_users_extra.main_userid)
            OR (branches.import_manager_id = xoops_users_extra.main_userid))
            AND xoops_users.uid = xoops_users_extra.main_userid 
            AND branches.branch_id = %d ORDER BY sort_order ASC

и для дополнительного персонала:

 SELECT CONCAT( xoops_users_extra.first_name, ' ', xoops_users_extra.last_name ) AS full_name, 
        positions.description AS position, xoops_users.email, xoops_users_extra.profile_image_thumb AS thumbnail
    FROM (xoops_users, xoops_users_extra, branches_extra, branches, positions)
    WHERE branches_extra.uid = xoops_users_extra.main_userid
        AND positions.id = branches_extra.position
        AND branches.branch_id = branches_extra.branch_id
        AND xoops_users.uid = xoops_users_extra.main_userid
        AND branches_extra.display =1
        AND branches.branch_id = %d

Я хотел бы объединить запросы в один запрос и объединить столбец "position" вместо нескольких записей ...

1 Ответ

1 голос
/ 30 октября 2009

Что вы, вероятно, хотели, было GROUP_CONCAT ()

SELECT userid, GROUP_CONCAT(position SEPARATOR ', ') 
FROM (
   ... position joining.
) 
GROUP BY userid;

И используйте этот запрос как подзапрос внутри большего запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...