Puxar linhas de volta de várias tabelas com um subselito?
-
05-07-2019 - |
Pergunta
Eu tenho um script que gera consultas da maneira a seguir (com base na entrada do usuário):
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;
O conjunto de dados resultante:
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] =>
)
O problema é que eu também preciso de todas as colunas da tabela 'People' (conforme referenciado no Sub Select) para voltar como parte do conjunto de dados. Eu não (obviamente) eu não fiz muito com o Sub Selects no passado, então essa abordagem é muito nova para mim. Como faço para recuar todas as linhas/colunas correspondentes da tabela de artigos, bem como das linhas/coluna da tabela de pessoas?
Solução
Você está familiarizado com as junções? Usando a sintaxe 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;
As defesas distintas de terem que definir um grupo por cada coluna retornada de ambas as tabelas. Eu o incluí porque você tinha o grupo na sua subconsência; Não sei se era realmente necessário.
Outras dicas
Você não poderia usar uma junção em vez de um subselito neste caso?
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;
Vamos começar do começo
- Você não deve precisar de um grupo por. Use distinto (em vez disso, você não está agregado na consulta interna).
Para ver o conteúdo da tabela interna, você realmente precisa se juntar a ela. O conteúdo não é exposto, a menos que apareça na seção de seção. Uma junção externa esquerda da tabela de pessoas à tabela de artigos deve ser equivalente a uma consulta:
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