2012-07-18 5 views
0

J'ai deux instructions de sélection que je voudrais combiner en une seule, bien que je n'aie besoin que des informations d'un champ dans la deuxième instruction select (Le champ data de user_info_data). Les champs dont j'ai besoin sont Firstname, lastname, email, cours fullname, role, et le champ data où fieldid = '15'. La première instruction select me donnera tout sauf le champ de données. Et la seconde me donne tout sauf le cours. J'ai essayé de faire la deuxième instruction select similaire au champ Rôle mais il se plaint de renvoyer plus d'une ligne. Si j'essaie d'utiliser le nom du cours sans la partie fieldid = '15 ', cela amène plus de 100k enregistrements (chaque utilisateur apparaît dans chaque cours et toutes ses données).Plusieurs jointures mysql, comment combiner ces deux statuts

Les champs pour les tables:

user(id,auth,confirmed,policyagreed,username,password,idnumber,firstname,lastname,email,phone etc..) 
user_info_data(id,userid,fieldid,data) 
role(id,name,shortname,description,sortorder) 
role_assignments(id,roleid,contextid,userid...) 
context(id,contextlevel,instanceid,path,depth) 

Première déclaration:

SELECT user.firstname AS Firstname, user.lastname AS Lastname, user.email AS Email, course.fullname AS Course, role.name AS Role 
FROM user AS user, course AS course,role,role_assignments AS asg 
INNER JOIN context AS context ON asg.contextid=context.id 
WHERE context.contextlevel = 50 
AND role.id=asg.roleid 
AND user.id=asg.userid 
AND context.instanceid=course.id 

sortie de la première stament:

Prénom Nom Email Cours Rôle

John Doe john.doe @ email.com Course-N amme étudiants

Deuxième déclaration:

SELECT user.firstname AS 'First Name', user.lastname AS 'Last Name', user.email AS 'Email', user_info_data.data AS 'IBCLC Certified' 
FROM user, user_info_data 
WHERE user.id = user_info_data.userid 
AND fieldid = '15' 

sortie de seconde stament:

Prénom Nom Email IBCLC certifié

John Doe [email protected] Oui

Sortie souhaitée:

FirstName, LastName, E-mail, IBCLC certifié, Cours, Rôle

Autre instruction select J'ai essayé: Amène 9,494 dossiers, mais maintenant les données sur le terrain où fieldid est 15 est une liste de choix possibles, pourrait c'est pourquoi?

SELECT user.firstname AS Firstname, user.lastname AS Lastname, user.email AS Email, userdata.data, course.fullname AS Course, role.name AS Role 
FROM user AS user, course AS course, user_info_data AS userdata, role,role_assignments AS asg 
INNER JOIN context AS context ON asg.contextid=context.id 
WHERE context.contextlevel = 50 
AND userdata.fieldid = 15 
AND role.id=asg.roleid 
AND user.id=asg.userid 
AND context.instanceid=course.id 
+0

Sur vos instructions select, vous avez essayé, pourquoi ne pas simplement ajouter 'role' à votre clause FROM au lieu d'utiliser une instruction select intégrée? – northpole

+0

@northpole Cela fonctionne, et apporte les mêmes résultats que la première instruction, mais je ne sais toujours pas comment obtenir le champ 'data' où fieldid = 15, sans avoir 113974 enregistrements; il ne devrait y avoir que 94. – Jonathan

+0

@johathan - dites-vous qu'il n'y a que 94 lignes où fieldid = 15? C'est la seule chose avec laquelle vous réduisez cette table. Devrait-il se joindre à dire utilisateurs par userid? Il me semble que vous pourriez manquer une clause where supplémentaire. – northpole

Répondre

1

J'ajouté user_info_data à votre première demande comme ceci:

SELECT user.firstname AS Firstname, 
     user.lastname AS Lastname, 
     user.email AS Email, 
     course.fullname AS Course, 
     role.name AS Role, 
     ibclcCert.data AS 'IBCLC Certified' 
FROM user, 
    course, 
    role, 
    role_assignments AS asg, 
    context, 
    user_info_data AS ibclcCert 
WHERE context.contextlevel = 50 
    AND role.id=asg.roleid 
    AND user.id=asg.userid 
    AND context.instanceid=course.id 
    AND asg.contextid=context.id 
    AND ibclcCert.userid = user.id 
    AND ibclcCert.fieldid = '15' 

Je rebaptisés la référence de table user_info_data à quelque chose indiquant le champ réel, ibclcCert dans ce cas. Ce changement de nom est une disposition dans le cas où vous souhaitez un jour accéder à plus d'un champ de données. Lorsque vous le faites, vous devez inclure la table plusieurs fois, une pour chaque champ dont vous avez besoin. Voir également this answer pour savoir comment gérer ces formats de données.

+0

Je l'ai essayé et j'ai reçu cette erreur: # 1054 - Colonne inconnue 'user.id' dans 'on clause' – Jonathan

+0

Y a-t-il une colonne 'user.id' dans votre base de données? Votre deuxième requête en utilise un, mais l'erreur indique qu'il n'y en a pas. Lequel a raison? – MvG

+0

Oui, il y a. utilisateur « Un enregistrement pour chaque personne » '1 \t id \t bigint (10) \t \t UNSIGNED \t Non \t Aucun \t AUTO_INCREMENT' Je suis une erreur semblable avant quand je jouais avec des rôles, je suis passé l'ordre que je les utilise et il est parti? – Jonathan