Вытянуть строки из нескольких таблиц с помощью дополнительного выбора? - PullRequest
0 голосов
/ 29 июля 2009

У меня есть скрипт, который генерирует запросы следующим образом (на основе пользовательского ввода):

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

)

Проблема в том, что мне нужно, чтобы все столбцы из таблицы «люди» (как указано в дополнительном элементе) возвращались как часть набора данных. Я (очевидно) не сделал много с подвыборками в прошлом, так что этот подход является очень новым для меня. Как вытащить все соответствующие строки / столбцы из таблицы статей, КАК ХОРОШО, как строки / столбец из таблицы сотрудников?

Ответы [ 3 ]

1 голос
/ 29 июля 2009

Вы знакомы с объединениями? Использование синтаксиса 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; Я не знаю, было ли это на самом деле необходимо.

0 голосов
/ 29 июля 2009

Давайте начнем с начала

  • Тебе не нужна группа. Вместо этого используйте отличные (вы не производите агрегирование во внутреннем запросе).
  • Чтобы увидеть содержимое внутренней таблицы, вам действительно нужно присоединиться к ней. Содержимое не отображается, если оно не отображается в разделе «От». Левое внешнее соединение из таблицы сотрудников в таблицу статей должно быть эквивалентно запросу 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
    
0 голосов
/ 29 июля 2009

Не могли бы вы использовать объединение вместо суб-выбора в этом случае?

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;
...