Domanda

Ho uno script che genera query nel modo seguente (basato sull'input dell'utente):

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;

Il set di dati risultante:

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] => 

)

Il problema è che ho anche bisogno di tutte le colonne della tabella "persone" (come indicato nella sottoselezione) per tornare come parte del set di dati. In passato non ho (ovviamente) fatto molto con i sotto-selettori, quindi questo approccio è molto nuovo per me. Come faccio a ritirare TUTTE le righe / colonne corrispondenti dalla tabella degli articoli COME BENE come le righe / colonne dalla tabella delle persone?

È stato utile?

Soluzione

Conoscete i join? Utilizzando la sintassi 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 evita di dover definire GROUP BY per ogni colonna restituita da entrambe le tabelle. L'ho incluso perché avevi il GROUP BY nella tua subquery; Non so se fosse effettivamente necessario.

Altri suggerimenti

In questo caso non potresti utilizzare un join anziché una sottoselezione?

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;

Iniziamo dall'inizio

  • Non dovresti aver bisogno di un gruppo di. Usa invece distinto (non stai eseguendo alcuna aggregazione nella query interna).
  • Per vedere il contenuto della tabella interna, devi effettivamente unirti ad essa. I contenuti non sono esposti a meno che non vengano visualizzati nella sezione da. Un join esterno sinistro dalla tabella delle persone alla tabella degli articoli dovrebbe essere equivalente a una query 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
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top