2014-06-18 1 views
1

J'ai deux tables, l'une montrant l'historique des requêtes de recherche, l'autre montrant les emplacements.GROUP BY dans SUBQUERY WITH UNION ALL

La première table est pour les requêtes de recherche: searchTerm | date | userId | historyId La seconde concerne les emplacements: userId | date | historyId | lat | J'utilise UNION ALL pour assembler ces sous-requêtes avec JOIN LEFT & JOIN RIGHT pour créer une FULL JOIN.

SELECT st, fa FROM 
       (SELECT webHistory.searchTerm AS st, locationHistory.fullAddress AS fa 
        FROM webHistory LEFT OUTER JOIN locationHistory 
        ON webHistory.historyId=locationHistory.historyId 
        UNION ALL 
        SELECT webHistory.searchTerm as st, locationHistory.fullAddress AS fa 
        FROM webHistory RIGHT OUTER JOIN locationHistory 
        ON webHistory.historyId=locationHistory.historyId) t 

Tout fonctionne très bien j'obtient des résultats pour seulement les entrées dans le tableau webHistory, et même pour la table locationHistory. Le problème que j'ai est quand je reçois des lignes qui ont été ajoutées aux deux. Ils montrent deux fois!

Je ne peux pas simplement utiliser union car il JOINTER plus que je ne le souhaite. Si deux des mêmes recherches sont ajoutées, au lieu d'en afficher deux, elles seront jointes en une seule. Donc j'ai besoin d'utiliser UNION ALL.

Je dois utiliser l'union car je suis joint à partir de la gauche et la droite et dans mySql FULL JOIN n'est pas supporté.

Donc je suppose que j'ai besoin de GROUP BY historyId car cet identifiant sera toujours le même sur les lignes ajoutées en même temps (lorsqu'une recherche est effectuée par requête et par emplacement). Le problème est, j'ai essayé et testé, mais je ne peux pas sembler faire fonctionner cela. Est-ce que je manque quelque chose?

Enfin, pendant que je pose une question et parce que je ne suis pas encore arrivé au point de tester cela, l'ORDER BY date sera sur le OUTER ou SUBQUERIES comme je veux montrer le plus récent comme premier résultat ?

/* Plus d'informations */

je dois à la sortie:

searchTerm s'il n'y a pas fullAddress. Adresse complète s'il n'y a pas searchTerm. SearchTerm & fullAddress s'il y a les deux.

Actuellement, il sort les deux premiers fins, mais ce dernier sort deux fois.

+0

Pourriez-vous donner quelques données d'échantillon et un résultat souhaité? J'ai du mal à comprendre exactement le résultat que vous aimeriez voir. –

+0

Désolé, j'avais du mal à l'expliquer, je vais ajouter plus d'informations maintenant. –

Répondre

2

En ce qui comprend, vous voulez en double avec le même HistoryID à éliminer, vous devriez donc être en mesure d'utiliser UNION aussi longtemps que le HistoryID est inclus dans le UNION afin que les doublons ne seront pas avec un autre HistoryID éliminé;

SELECT st, fa FROM 
(SELECT webHistory.searchTerm AS st, 
     locationHistory.fullAddress AS fa, 
     webHistory.historyId 
    FROM webHistory LEFT OUTER JOIN locationHistory 
    ON webHistory.historyId=locationHistory.historyId 
    UNION 
    SELECT webHistory.searchTerm as st, 
     locationHistory.fullAddress AS fa, 
     locationHistory.historyId 
    FROM webHistory RIGHT OUTER JOIN locationHistory 
    ON webHistory.historyId=locationHistory.historyId) t 
+0

Vous êtes un diamant absolu, merci beaucoup pour l'aide! –