2014-09-18 5 views
-1

j'ai une requête qui renverra tous les enregistrements gis qui répondent à un intérieur spécifique rejoindre contrainte:deux requêtes MySQL combinés en un seul

SELECT gis.id_gis, gis.titre, gis.lat, gis.lon FROM spip_gis AS `gis` 
INNER JOIN spip_mots_liens AS L1 ON (L1.id_objet = gis.id_gis AND 
L1.objet='gis') WHERE (L1.id_mot = 210118) GROUP BY gis.id_gis 

J'ai une deuxième requête qui renverra le articles.id_article pour un enregistrement gis donné (dans cet exemple gis fiche 136):

SELECT articles.id_article, articles.lang, articles.titre FROM 
spip_articles AS `articles` INNER JOIN spip_gis_liens AS L1 ON (
L1.id_objet = articles.id_article AND L1.objet='article') WHERE 
(articles.statut = 'publie') AND (L1.id_gis = 136) GROUP BY 
articles.id_article 

Comment puis-je prolonger la première requête afin qu'il retourne également articles.id_article respectifs de chaque enregistrement?

J'ai téléchargé le schéma sql ici: http://pastebin.com/8Fe0Lnx3

+3

La première chose à faire est de formater ces requêtes un peu mieux. –

+0

Liens externes ne servent à rien. Qu'avez-vous essayé jusqu'à présent? Avez-vous du code qui ne fonctionne pas? –

+0

union d'utilisateur http://dev.mysql.com/doc/refman/5.0/en/union.html –

Répondre

1

peut vous donner cette requête un essai et dites-moi ce qu'il retourne

SELECT gsis.id_gis, gsis.titre, gsis.lat, gsis.lon, articlesGen.id_article, articlesGen.lang, 
articlesGen.titre 
from 
(SELECT gis.id_gis, gis.titre, gis.lat, gis.lon FROM spip_gis AS `gis` 
INNER JOIN spip_mots_liens AS L1 ON (L1.id_objet = gis.id_gis AND 
L1.objet='gis') WHERE (L1.id_mot = 210118) GROUP BY gis.id_gis) gsis 
inner join 
(SELECT articles.id_article, articles.lang, articles.titre,L1.id_gis FROM 
spip_articles AS `articles` INNER JOIN spip_gis_liens AS L1 ON (
L1.id_objet = articles.id_article AND L1.objet='article') WHERE 
(articles.statut = 'publie') AND (L1.id_gis = 136) GROUP BY 
articles.id_article) articlesGen 
on articlesGen.id_gis = gsis.id_gis 
+0

Merci! Cette requête retournera le id_gis, titre, lat, lon, id_article pour l'enregistrement 136, si je supprime "AND (L1.id_gis = 136)", alors je reçois exactement ce que je recherchais, les enregistrements gis + l'article ID – Bwyss

+0

You sont les bienvenus! –

2

Si vous voulez une seule requête, il pourrait être complexe. Une façon que je peux faire est comme ci-dessous:

SELECT gis.id_gis, gis.titre, gis.lat, gis.lon, articles.id_article, articles.lang, articles.titre FROM 
    (
     SELECT articles.id_article AS id_article, articles.lang AS lang, articles.titre AS titre,articles.statut AS statut FROM 
      spip_articles AS articles 
      INNER JOIN 
      spip_gis_liens AS L1 
      ON (L1.id_objet = articles.id_article AND L1.objet='article') 
     WHERE (articles.statut = 'publie') AND (L1.id_gis = 136) 
     GROUP BY articles.id_article 
    ) AS articles 
    INNER JOIN 
    (
     SELECT gis1.id_gis AS id_gis, gis1.titre AS titre, gis1.lat AS lat, gis1.lon AS lon FROM 
      (
       SELECT gis.id_gis AS id_gis, gis.titre AS titre, gis.lat AS lat, gis.lon AS lon FROM 
        spip_gis AS gis 
        INNER JOIN 
        spip_mots_liens AS L1 
        ON (L1.id_objet = gis.id_gis AND L1.objet='gis') 
       WHERE (L1.id_mot = 210118) 
       GROUP BY gis.id_gis 
      ) AS gis1 
      INNER JOIN 
      spip_gis_liens AS gis2 
      ON (gis1.id_gis = gis2.id_objet) 
    ) AS gis 
    ON (articles.id_article = gis.id_gis) 

L'essentiel est d'utiliser INNER JOIN récursive sur les tables pour se connecter les uns des autres sur la base des clés primaires, dites 'id_objet' et 'id_article'. Les noms de colonne peuvent être mis à jour chaque fois que vous attribuez un nouveau nom à la table de sortie (en utilisant AS).