2014-09-19 4 views
0

Je rencontre un problème lors de l'écriture d'une requête. J'ai deux tables dont je veux tirer des données, des ventes et des appels. Il y a une colonne dans les deux tables où un numéro de téléphone est enregistré, ainsi qu'une colonne de date. Je peux faire le JOIN juste pour faire correspondre les appels aux ventes, mais je veux aussi montrer les entrées des deux tables qui ne correspondent pas. Fondamentalement sur une seule page montre les lignes qui correspondent à partir des deux tables, puis les lignes qui ne correspondent pas à partir de chaque table séparément.Requête multi mysql utilisant deux tables différentes

Voici la requête JOIN:

SELECT 
    sales.*, 
    calls.* 
FROM `sales` 
JOIN `calls` 
    ON sales.TelephoneNo = calls.TelephoneNo 
WHERE (
     sales.OrderDate >= '$MyStartDATE' 
    AND sales.OrderDate <= '$MyEndDATE' 
) AND (
     calls.CallDate >= '$MyStartDATE' 
    AND calls.CallDate <= '$MyEndDATE' 
) ORDER BY sales.OrderDate 
+1

Vous cherchez peut-être pour un [ 'FULL OUTER JOIN'] (http://stackoverflow.com/questions/4796872/full-outer-join-in-mysql). – Wrikken

Répondre

0

Eh bien, essayez d'utiliser <> opérateur au lieu = montrer ne correspond pas résultats

SELECT 
    sales.*, 
    calls.* 
FROM `sales` 
JOIN `calls` 
    ON sales.TelephoneNo <> calls.TelephoneNo 
WHERE (
     sales.OrderDate >= '$MyStartDATE' 
    AND sales.OrderDate <= '$MyEndDATE' 
) AND (
     calls.CallDate >= '$MyStartDATE' 
    AND calls.CallDate <= '$MyEndDATE' 
) ORDER BY sales.OrderDate 

MISE À JOUR

Si vous utiliser LEFT JOIN Au lieu de JOIN ça fait la différence?

Essayez ce code

SELECT sales.*, 
     calls.* 
FROM `sales` 
     LEFT JOIN `calls` 
       ON sales.telephoneno <> calls.telephoneno 
WHERE sales.orderdate >= '$MyStartDATE' 
     AND sales.orderdate <= '$MyEndDATE' 
     AND calls.calldate >= '$MyStartDATE' 
     AND calls.calldate <= '$MyEndDATE' 
ORDER BY sales.orderdate 
+0

J'ai essayé cette option mais ce que j'ai obtenu était une rangée de la table d'appels répété pour chaque ligne de la table des ventes. Ainsi, une table de vente de 200 lignes correspondant à la table d'appel avec 300 a donné plus de 5000 résultats. – user2843577

+0

Parce qu'il est presque similaire à une jointure croisée – Gervs

+0

Une jointure à gauche fait peu de différence. vous obtiendrez seulement plus d'enregistrements dans le résultat – Gervs

0

MySQL ne supporte pas les jointures complètes, vous devrez combiner gauche et à droite se joindre à l'union

SELECT 
    s.OrderDate, 
    PhoneNumber, 
    s.something fake, 
    IF(c.PhoneNumber IS NULL, 'Sales', 'Both') match_from, 
    IF(c.PhoneNumber IS NULL, 0, 1) has_match 
FROM 
    sales s 
LEFT JOIN 
    calls c 
    USING (PhoneNumber) 
WHERE 
    s.OrderDate BETWEEN '$MyStartDATE' AND '$MyEndDATE' 
UNION DISTINCT 
SELECT 
    c1.CallDate, 
    PhoneNumber, 
    'fake', 
    IF(s1.PhoneNumber IS NULL, 'Call', 'Both'), 
    IF(s1.PhoneNumber IS NULL, 0, 1) 
FROM 
    sales s1 
RIGHT JOIN 
    calls c1 
    USING (PhoneNumber) 
WHERE 
    c1.CallDate BETWEEN '$MyStartDATE' AND '$MyEndDATE' 
ORDER BY has_match 
+0

Est-il possible d'obtenir le reste des données des autres colonnes? Je sais que chaque table a un nombre de colonnes différent, ce qui n'est peut-être pas possible avec votre solution. Je dirais que c'est beaucoup plus propre que ce que je préparais. – user2843577

+0

Oui, vous pouvez ajouter des colonnes "fausses" à la clause SELECT pour la table où vous avez moins de colonnes. Je vais mettre à jour ma réponse avec un exemple. – Gervs

Questions connexes