2009-07-29 12 views
0

je un script qui génère des requêtes de la manière suivante (sur la base de l'entrée d'utilisateur):Récupère des lignes de plusieurs tables avec un sous-select?

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 je également besoin de toutes les colonnes de la table 'people' (comme référencé dans le sous select) pour revenir en tant que partie de l'ensemble de données. Je n'ai pas (évidemment) fait beaucoup de sous sélections dans le passé donc cette approche est très nouvelle pour moi. Comment puis-je retirer toutes les lignes/colonnes correspondantes de la table des articles AINSI que les lignes/colonnes de la table des personnes?

+0

pouvez-vous travailler sur la mise en forme s'il vous plaît? – gbn

+0

Quelqu'un peut-il expliquer la différence clé entre JOIN et INNTER JOIN? SELECT * À PARTIR D'ARTICLES t JOIN PEOPLE p ON p.spubid = t.spubid ET p.saffil = 'DAS' O WH t.keywords_auto ILIKE '% pm2%'; Versus: SELECT a *, p * des articles comme INNER JOIN personnes comme p = ON a.spubid p.spubid OÙ a.skeywords_auto iLike '% PM2%' et p.saffil = '.. DAS '; Je reçois le même jeu de résultats avec les deux. –

+0

Apparemment le formatage ne se fait pas dans les commentaires ... #hrmph –

Répondre

1

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; 

La variable DISTINCT évite de devoir 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.

+0

Blessé en s'installant sur cette solution: SELECT * FROM articles en tant que INNER JOIN les gens AS p ON a.spubid = p.spubid Statut INNER JOIN en tant que s sur a.spubid = s.spubid OERE a.swordwords_auto ilike '% pm2%' ET p.saffil = 'DAS' et p.slast ilike '% Chow%' ET s.iyear> = 2000; –

0

Pourriez-vous 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; 
+0

Les parenthèses utilisées dans les clauses JOIN et WHERE ne sont pas nécessaires. –

+0

Modifié. Bien que je les garde habituellement sur la clause ON. – Jon

0

permet de démarrer dès le début

  • Vous ne devriez pas besoin d'un groupe par. 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 joindre. Le contenu n'est pas exposé à moins qu'il n'apparaisse dans la section from. Une jointure externe gauche de la table des gens à la table des articles devrait être équivalent à 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 
    
Questions connexes