2010-03-24 6 views
4

J'essaie de GAUCHER JOIN deux tables, pour obtenir une liste de toutes les lignes de TABLE_1 et une ligne connexe de TABLE_2. J'ai essayé LEFT JOIN et GROUP BY c_id, cependant je ne voulais pas que la ligne de TABLE_2 soit triée par isHeadOffice DESC.Utilisation de LEFT JOIN pour sélectionner uniquement une ligne jointe

Voici quelques exemples de tableaux

TABLE 1 
c_id Name 
---------------- 
1  USA 
2  Canada 
3  England 
4  France 
5  Spain 

TABLE2 
o_id c_id Office    isHeadOffice 
------------------------------------------------ 
1  1  New York   1 
2  1  Washington   0 
3  1  Boston    0 
4  2  Toronto    0 
5  3  London    0  
6  3  Manchester   1 
7  4  Paris    1 
8  4  Lyon    0 

Alors ce que je suis en train de faire de ce serait quelque chose comme:

RESULTS 
c_id Name  Office 
---------------------------- 
1  USA   New York 
2  Canada  Toronto 
3  England  Manchester 
4  France  Paris 
5  Spain  NULL 

J'utilise PHP MySQL &. Des idées?

Répondre

4
SELECT * 
FROM table1 t1 
LEFT JOIN 
     table2 
ON  o.id = 
     (
     SELECT o_id 
     FROM table2 t2 
     WHERE t2.c_id = t1.c_id 
     ORDER BY 
       t2.c_id DESC, t2.isHeadOffice DESC, t2.o_id DESC 
     LIMIT 1 
     ) 

Créer un index sur table2 (c_id, isHeadOffice, o_id) pour que cela fonctionne rapidement.

La clause ORDER BY de la sous-requête peut sembler redondante, mais il est nécessaire pour MySQL de choisir le bon index.

0

Pourquoi ne pas:

SELECT c_id, name, 
(SELECT t2.office 
FROM table2 t2 
WHERE t2.c_id = t1.c_id AND t2.isHeadOffice = 1 
LIMIT 1) office 
FROM table1 t1 
ORDER BY 3 DESC 
+1

Je crois que vous avez besoin d'une clause "Order by isHeadOffice Desc" dans la sous-requête. – Dan

+0

bien, la table source ici est table1 qui n'a pas ce champ; ffrom table2 Je viens d'obtenir le champ de bureau –

+0

Je viens d'ajouter l'ORDRE PAR 3 DESC –

0

Cela suppose que votre isHeadOffice est un champ de bits et vous n'avoir un siège social par pays.

SELECT 
    Table1.c_id, 
    Table1.Name, 
    Table2.Office 
FROM 
    Table1 
LEFT OUTER JOIN 
    Table2 
ON 
    Table1.c_id = Table2.c_id 
AND 
    Table2.isHeadOffice = 1