2011-10-06 3 views
0

Je sais qu'il y a beaucoup de bonnes questions répondues sur Left rejoint, mais j'ai du mal à trouver quelque chose concernant mon problème particulier. Je m'excuse pour un sujet répété possible, mais l'aide serait grandement appréciée.MySQL Left Join ne produisant pas les résultats attendus

J'ai deux tables qui contiennent des ventes de cartes-cadeaux. Je dois vérifier que les montants correspondent. Je suis à la recherche d'aide pour rédiger une requête qui renverra tout le tableau A, même s'il n'y a pas d'enregistrement correspondant dans le tableau B.

TABLEAU A

| id | business_date | am_pm | gift_cards_sold | 
================================================ 
103 | 2011-10-06 | PM | 175.03 
104 | 2011-10-06 | PM | 135.03 
105 | 2011-10-06 | PM | 250.74 
106 | 2011-10-06 | PM | 180.44 
107 | 2011-10-06 | PM | 150.10 
108 | 2011-10-06 | PM | 130.00 

TABLEAU B

| id | business_date | am_pm | gift_cards_sold | 
================================================ 
103 | 2011-10-06 | PM | 100.03 
105 | 2011-10-06 | PM | 250.74 
106 | 2011-10-06 | PM | 180.44 
107 | 2011-10-06 | PM | 150.10 

Voici ma requête jusqu'à présent (évidemment quelque chose ne va pas avec elle)

SELECT A.id AS ID, A.gift_cards_sold AS A_SOLD, B.gift_cards_sold AS B_SOLD 
FROM A 
LEFT JOIN B 
USING (id) 
WHERE A.am_pm = 'PM' 
AND A.business_date = '2011-10-06' 
AND B.business_date = '2011-10-06' 
GROUP BY A.id 
ORDER BY A.id ASC 

Voici le résultat:

| id | A_SOLD | B_SOLD | 
======================== 
103 | 175.03 | 100.03 
105 | 250.74 | 250.74 
106 | 180.44 | 180.44 
107 | 150.10 | 150.10 

Comme vous pouvez le voir, il y a un écart avec l'identifiant de 103. Cependant, je dois avoir le résultat montrer tous les id, peu importe s'il y a un match ou non. L'ensemble de résultats est ce que j'attendrais de l'utilisation d'une jointure interne.

Répondre

1

Il suffit de déplacer la condition B.business_date = '2011-10-06' du WHERE à la clause ON. Lorsque vous avez une jointure LEFT, une condition WHERE sur les colonnes de la deuxième table (sauf IS (NOT) NULL) annule effectivement la LEFT JOIN, elle agit alors comme INNER JOIN.

SELECT A.id AS ID 
    , A.gift_cards_sold AS A_SOLD 
    , B.gift_cards_sold AS B_SOLD 
FROM A 
    LEFT JOIN B 
    ON B.id = A.id 
    AND B.business_date = '2011-10-06' 
WHERE A.am_pm = 'PM' 
    AND A.business_date = '2011-10-06' 
ORDER BY A.id 
+0

Merci pour votre aide. – Brett

1

Vous devez utiliser quelque chose comme ceci:

SELECT A.id AS ID, A.gift_cards_sold AS A_SOLD, B.gift_cards_sold AS B_SOLD 
FROM A 
LEFT JOIN B 
USING (id) 
WHERE A.am_pm = 'PM' 
AND A.business_date = '2011-10-06' 
AND (B.business_date = '2011-10-06' or B.business_date is null) 
GROUP BY A.id 
ORDER BY A.id ASC 
0

Le problème est à l'état où pour B.business_date, il devrait également permettre nul

SELECT A.id AS ID, A.gift_cards_sold AS A_SOLD, B.gift_cards_sold AS B_SOLD 
FROM A LEFT JOIN B ON A.id = B.id 
WHERE A.am_pm = 'PM' 
AND A.business_date = '2011-10-06' 
AND (B.business_date = '2011-10-06' OR B.business_date is null) 
ORDER BY A.id ASC 
1

Je ne sais pas pourquoi vous utilisiez une clause "group by" - ce n'est pas nécessaire ici, et dans la plupart des autres bases de données, ce serait une erreur de syntaxe.

Je suppose que vous avez seulement besoin de faire correspondre les lignes sur id.

Cela devrait fonctionner:

select A.id AS ID, A.gift_cards_sold AS A_SOLD, B.gift_cards_sold AS B_SOLD 
from A left join b on b.id = a.id 
where A.business_date = '2011-10-06' 
    and A.am_pm = 'PM' 
order by a.id 
+0

Le "Grouper par" n'était pas nécessaire. Je l'ai tapé par habitude, merci. – Brett

+0

Les gens suggérant de joindre B à gauche et d'ajouter 'ou B.xxx est nul' ne comprennent clairement pas ce qu'est une jointure à gauche. – GreyBeardedGeek