2009-07-29 3 views
0

I가 다음과 같은 방식으로 쿼리를 생성하는 스크립트 (사용자 입력에 기초하여) 가지고하위 선택이있는 여러 테이블에서 행을 뒤로 당깁니다?

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

)는

문제 I 이는 또한 '사람'테이블의 모든 열 (하위 선택에서 참조 된대로)이 데이터 집합의 일부로 돌아 오도록해야합니다. 나는 과거에 하위 선택 (sub select)을 많이하지 않았으므로이 접근법은 나에게 매우 새로운 것이다. 기사 테이블의 모든 일치하는 행/열을 사람 테이블의 행/열처럼 그대로 되돌리려면 어떻게해야합니까?

+0

당신은 포맷 작업을하시기 바랍니다 수 있습니까? – gbn

+0

누군가 JOIN과 INNTER JOIN의 주요 차이점을 설명해 주실 수 있습니까? SELECT * t 사람들에게 P = ON p.spubid t.spubid p.saffil AND = 'DAS' WHERE t.skeywords_auto ILIKE '% 1 %의 PM2'가입 ARTICLES FROM; 대 : 이를 SELECT * P * 기사 의 FROM INNER이 = p.spubid WHERE a.skeywords_auto ILIKE '% PM2 %'AND p.saffil = 'a.spubid ON 페이지로 사람을 가입한다.. DAS '; 두 결과 모두 동일한 결과를 얻습니다. –

+0

분명히 형식화가 주석에 이월되지 않습니다 ... #hrmph –

답변

1

조인에 익숙합니까? 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

이 솔루션에 상처를 입은 사람 : SELECT * FROM articles from INNER JOIN people AS p ON a.spubid = p.spubid INNER JOIN 상태는 a.spubid = s.spubid에 있습니다. a.skeywords_auto ilike '% pm2 %' AND p.saffil = 'DAS'AND p.slast ilike '% Chow %'AND s.iyear> = 2000; –

0

이 경우 하위 선택 대신 가입을 사용할 수 있습니까?

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

JOIN 및 WHERE 절에 사용 된 괄호는 필요하지 않습니다. –

+0

수정 됨. 나는 대개 그것들을 ON 절에두고 있지만. – Jon

0

처음

  • 당신은에 의해 그룹을 필요가 없습니다에서 시작 할 수 있습니다. 대신 뚜렷한 것을 사용하십시오 (내부 쿼리에서 어떤 집계도 수행하지 않습니다).
  • 내부 테이블의 내용을 보려면 실제로 들어야합니다. 내용은 시작 부분에 나타나지 않으면 노출되지 않습니다. 왼쪽 외부는 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