Вытащить строки из нескольких таблиц с помощью подвыбора?
-
05-07-2019 - |
Вопрос
У меня есть скрипт, который генерирует запросы следующим образом (на основе пользовательского ввода):
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;
Результирующий набор данных:
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] =>
)
Проблема в том, что мне также нужно, чтобы все столбцы из таблицы «Люди» (как указано в подзаголовке) вернулись как часть набора данных.Раньше я (очевидно) мало что делал с дополнительными выборками, поэтому этот подход для меня очень нов.Как мне вернуть все соответствующие строки/столбцы из таблицы статей, А ТАКЖЕ строки/столбцы из таблицы людей?
Решение
Вы знакомы с объединениями?Использование синтаксиса 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 избавляет от необходимости определять GROUP BY для каждого столбца, возвращаемого из обеих таблиц.Я включил его, потому что в вашем подзапросе была GROUP BY;Я не знаю, было ли это вообще необходимо.
Другие советы
Не могли бы вы в этом случае использовать соединение вместо подвыбора?
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;
Начнем с самого начала
- Вам не нужна группа.Вместо этого используйте различные (вы не выполняете агрегацию во внутреннем запросе).
Чтобы увидеть содержимое внутренней таблицы, вам действительно нужно присоединиться к ней.Содержимое не отображается, если оно не отображается в разделе from.Левое внешнее соединение таблицы People с таблицей статей должно быть эквивалентно запросу 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