2009-10-27 5 views
0

J'ai la configuration du tableau suivant:MySQL fusion de deux requêtes

table branches:

... 
manager_id 
sales_manager_id 
admin_manager_id 
... 

les colonnes mentionnées ci-dessus contiennent la clé étrangère pour la table des utilisateurs.

pour compliquer les choses, j'ai aussi une table branches_extra:

branches_extra:

id 
branch_id 
user_id 
position_id 

qui contient user_id, branch_id clés étrangères pour plus, le personnel qui seront affichés sur une des branches page de contact sur un site Web . Le problème est que les utilisateurs sont parfois affichés plus d'une fois car ils peuvent avoir plusieurs positions/rôles, j'ai actuellement 2 requêtes que j'utilise pour retourner les gestionnaires spécifiés dans la table branches et ensuite le personnel supplémentaire dans la table branches_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 

et pour le personnel supplémentaire:

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 

je voudrais fusionner les requêtes pour une seule requête et concat la colonne « position » au lieu d'avoir plusieurs entrées ...

+0

Le schéma global n'est pas clair. Par exemple Qu'est-ce que ce champ main_userid de la table xoops_users_extra? Quels sont les champs de table des positions etc. BTW Je vous encourage à utiliser la syntaxe JOIN explicite, parce que, si rien d'autre, de telles constructions introduisent une "auto-documentation", ce qui rend beaucoup plus facile à partager (ou même à revisiter)) le code source de la requête. – mjv

+0

C'est un gâchis incompréhensible que j'ai recenlty été employé pour maintenir ;-p –

+0

peu importe je crois que je vais faire un tableau se muer en php ... –

Répondre

1

Qu'est-ce que vous probablement voulu était GROUP_CONCAT()

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

Et utiliser cette requête comme une sous-requête à l'intérieur de la requête plus grande.

+0

Vous m'a envoyé le bon chemin avec GROUP_CONCAT() mais j'ai du mal à essayer d'obtenir J'accepte 'position' comme un champ, je reçois cette erreur: # 1054 - Colonne inconnue 'position' dans 'liste des champs' Je suppose que c'est parce que 'position' n'est pas vraiment une colonne –