2010-12-01 28 views
1

Ok, donc j'ai deux tables dans MySQL. Une table contient des informations sur les clients, l'autre contient des numéros de téléphone. Je dois joindre ces tables dans une requête pour sélectionner jusqu'à deux numéros de téléphone de la table de téléphones aussi bien que l'information de client. en ce moment ma requête est:Une requête rejoindre avec plusieurs lignes d'une table

SELECT customers.name, phones.phone, phones2.phone 
FROM customers 
LEFT JOIN phones ON phones.customerid=customers.id 
LEFT JOIN phones AS phones2 ON phones2.customerid=customers.id 
GROUP BY customers.id; 

Cependant, cela renvoie le même numéro de téléphone pour le téléphone 1 et le téléphone 2. essentiellement ce que je dois faire est compensé par phones2 1, mais je ne sais pas comment faire syntaxiquement.

Les téléphones se trouvent dans une table distincte car il s'agit d'une relation un à plusieurs.

J'ai besoin que ce soit dans une requête parce que je l'exporte directement à un csv.

L'aide est très appréciée. Merci d'avance.

Répondre

1

Pour éviter d'avoir le même numéro de téléphone que vous pourriez deux fois changer ceci:

LEFT JOIN phones AS phones2 ON phones2.customerid=customers.id 

à ceci:

LEFT JOIN phones AS phones2 ON phones2.customerid=customers.id 
AND phones2.phone <> phones.phone 
+0

c'est parfait. J'ai voté pour vous et j'ai ensuite essayé d'accepter la réponse, mais il m'a dit que je devais attendre 9 minutes. Je vais le faire dès que possible. merci, marque. – Chris

+0

@thejew - Vous ne devriez pas avoir à vous joindre à la table des téléphones deux fois pour cela. –

+0

comment le ferais-je sans joindre deux fois? – Chris

3

Vous voulez juste un 0,1 arbitraire ou 2 numéros de téléphone par client puis ? Si oui Max et Min OK? Cela vous permettra d'économiser une jointure.

SELECT customers.name, 
     MAX(phones.phone) AS phone, 
     CASE WHEN MAX(phones.phone) = MIN(phones.phone) THEN NULL ELSE MIN(phones.phone) END AS phone2 
FROM customers 
LEFT JOIN phones ON phones.customerid=customers.id 
GROUP BY customers.id; 
+0

+1 C'est une approche intelligente. –

+0

je vois. Cela fonctionnerait aussi bien. le problème est que j'avais fait ma question plus simple que mon problème initial était. Je suis en train de tirer jusqu'à trois courriels et trois numéros de téléphone pour chaque client. Je pourrais mettre au point une solution qui pourrait l'utiliser, mais je pense que cela deviendrait assez désordonné bientôt. Cependant, cela fonctionnerait certainement pour seulement deux. – Chris

+0

@thejew - Donc, votre requête actuelle va se joindre à «téléphones» 3 fois alors? Je suppose que vous pourriez combiner les deux approches afin d'obtenir les 'Max' et' Min' de la seconde JOIN (ie de 'phones2') Si j'avais plus de temps, j'essayerais d'assommer une solution de type' row_number' [(possible en MySQL en utilisant des variables)] (http://www.artfulsoftware.com/infotree/queries.php?&bw=1440#104) –

1

Ce que vous voulez faire est de supprimer les cas où les chiffres sont les mêmes.

SELECT customers.name, phones.phone, phones2.phone 
FROM customers 
LEFT JOIN phones ON phones.customerid=customers.id 
LEFT JOIN phones AS phones2 ON phones2.customerid=customers.id 
WHERE phones2.phone != phones.phone 
GROUP BY customers.id 
Questions connexes