Question

J'ai un script qui génère des requêtes de la manière suivante (en fonction des entrées de l'utilisateur):

SELECT * FROM articles 
 WHERE (articles.skeywords_auto ilike '%pm2%') 
  AND spubid IN (
   SELECT people.spubid FROM people 
   WHERE (people.slast ilike 'chow') 
   GROUP BY people.spubid) 
 LIMIT 1;

L'ensemble de données résultant:

Array ( [0] => 
  Array ( 
          [spubid] => A00603 
          [bactive] => t 
          [bbatch_import] => t 
          [bincomplete] => t 
          [scitation_vis] => I,X 
          [dentered] => 2009-07-24 17:07:27.241975 
          [sentered_by] => pubs_batchadd.php 
          [drev] => 2009-07-24 17:07:27.241975 
          [srev_by] => pubs_batchadd.php 
          [bpeer_reviewed] => t 
          [sarticle] => Errata: PM2.5 and PM10 concentrations from the Qalabotjha low-smoke fuels macro-scale experiment in South Africa (vol 69, pg 1, 2001) 
          [spublication] => Environmental Monitoring and Assessment 
          [ipublisher] => 
          [svolume] => 71 
          [sissue] => 
          [spage_start] => 207 
          [spage_end] => 210 
          [bon_cover] => f 
          [scover_location] => 
          [scover_vis] => I,X 
          [sabstract] => 
          [sabstract_vis] => I,X 
          [sarticle_url] => 
          [sdoi] => 
          [sfile_location] => 
          [sfile_name] => 
          [sfile_vis] => I
          [sscience_codes] => 
          [skeywords_manual] => 
          [skeywords_auto] => 1,5,69,2001,africa,assessment,concentrations,environmental,errata,experiment,fuels,low-smoke,macro-scale,monitoring,pg,pm10,pm2,qalabotjha,south,vol 
          [saward_number] => 
          [snotes] => 

)

Le problème est que j'ai également besoin de toutes les colonnes de la table "personnes" (comme indiqué dans la sous-sélection) pour revenir dans le jeu de données. Je n'ai (évidemment) pas fait grand chose avec les sous-sélections dans le passé, cette approche est donc très nouvelle pour moi. Comment puis-je récupérer toutes les lignes / colonnes correspondantes de la table des articles ainsi que les lignes / colonnes de la table des personnes?

Était-ce utile?

La solution

Connaissez-vous les jointures? Utilisation de la syntaxe ANSI:

SELECT DISTINCT *
  FROM ARTICLES t
  JOIN PEOPLE p ON p.spubid = t.spudid AND p.slast ILIKE 'chow'
 WHERE t.skeywords_auto ILIKE'%pm2%'
 LIMIT 1;

DISTINCT évite de définir un GROUP BY pour chaque colonne renvoyée par les deux tables. Je l'ai inclus parce que vous aviez le GROUP BY sur votre sous-requête; Je ne sais pas si c'était vraiment nécessaire.

Autres conseils

Ne pouvez-vous pas utiliser une jointure au lieu d'une sous-sélection dans ce cas?

SELECT a.*, p.*
FROM articles as a
INNER JOIN people as p ON a.spubid = p.spubid
WHERE a.skeywords_auto ilike '%pm2%'
AND p.slast ilike 'chow'
LIMIT 1;

Permet de commencer depuis le début

  • Vous ne devriez pas avoir besoin d'un groupe d'ici. Utilisez distinct à la place (vous ne faites aucune agrégation dans la requête interne).
  • Pour voir le contenu de la table interne, vous devez réellement le rejoindre. Le contenu n'est exposé que s'il apparaît dans la section from. Une jointure externe gauche de la table des personnes à la table des articles doit être équivalente à une requête IN:

    SELECT *
    FROM people 
    LEFT OUTER JOIN articles ON articles.spubid = people.spubid 
    WHERE people.slast ilike 'chow' 
    AND articles.skeywords_auto ilike '%pm2%' 
    LIMIT 1
    
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top