2014-09-18 3 views
1

숙제를 위해 전 세계에 대한 정보 데이터베이스에서 쿼리를 작성해야합니다. 내 쿼리 중 하나에서 오류가 발생하고 이유를 파악할 수 없습니다. 나는에 문제가하고있는 쿼리에 대한 문제 문은 다음과 같습니다PHP의 두 테이블에서 정보를 가져올 때 쿼리 오류가 발생했습니다

Find all official languages, the country for which it is spoken, and the percentage of speakers  
(percentage of speakers is calculated as percentage spoken times country population divided by 100). 
Order results by the total number of speakers with the most popular language first. (238 results) 

나는 웹 사이트에서 내 쿼리를 실행하려고 할 때 내가 오류는 다음과 같습니다

Query failed: ERROR: missing FROM-clause entry for table "city" LINE 1: ...kers FROM lab2.country AS 
co JOIN lab2.country ON lab2.city....^

내가 쓴 코드 내 검색어 :

case 11: 
        $q = "SELECT name, language, ((pecentage * population)/100) AS 
percentage_of_speakers FROM lab2.country AS co JOIN lab2.country ON lab2.city.country_code WHERE 
(is_official IS TRUE) ORDER BY percentage_of_speakers DESC"; 

        $result = pg_query($q) or die ('Query failed: '. pg_last_error()); 
        break; 

이 쿼리에 대한 정보는 하나가 아닌 두 개의 다른 테이블에서 가져옵니다. 두 테이블에서 데이터를 가져 오려면 JOIN 문을 사용해야한다고 생각합니다. 다음은 사용중인 2 개의 테이블입니다. 사전에 도움을 주셔서 감사합니다.

Table "lab2.country_language" 
Column |   Type   |    Modifiers     
--------------+-----------------------+---------------------------------------- 
country_code | character(3)   | not null default ''::bpchar 
language  | character varying(30) | not null default ''::character varying 
is_official | boolean    | not null default false 
percentage | real     | not null default 0::real 

          Table "lab2.country" 
Column  |   Type   |    Modifiers     
-----------------+-----------------------+-------------------------------------- 
country_code | character(3)   | not null default ''::bpchar 
name   | character varying(52) | not null default ''::character varying 
continent  | continent    | not null 
region   | character varying(26) | not null default ''::character varying 
surface_area | real     | not null default 0::real 
indep_year  | smallint    | 
population  | integer    | not null default 0 
+0

문제를 올바르게 시도해 주셔서 감사합니다. (같은 코스에있는 다른 학생이 일찍이 이렇게 가난한 시도를 게시했습니다 (http://stackoverflow.com/q/25913964/398670)).앞으로는 숙제에 도움을 청할 때 숙제라고 말하십시오. –

답변

1

내가 읽을 수 있도록 쿼리를 다시 포맷했지만 문제를 해결하지 못했습니다. 여기에 더 나은 서식 보이는 방법은 다음과 같습니다

SELECT 
    name, 
    language, 
    ((pecentage * population)/100) AS percentage_of_speakers 
FROM lab2.country AS co 
    JOIN lab2.country ON lab2.city.country_code 
WHERE is_official 
ORDER BY percentage_of_speakers DESC 

쿼리의 문제는 두 가지가 아래 부분을 강조 수 있습니다 :

FROM lab2.country AS co 
    JOIN lab2.country ON lab2.city.country_code 
       ^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ 

첫 번째 문제는 (자체에 lab2.country에 가입하려고하는 것입니다 lab2.country AS co JOIN lab2.country). 실제로 SQL에서 그렇게 할 수 있습니다. 때때로 유용하지만 실제로 필요한 것은 아닙니다. 대신 lab2.country ~ lab2.city에 가입해야합니다.

더 큰 문제는 조인에 ON 표현입니다. 당신은 그런 가치에 가입 할 수 없습니다. 부울 값으로 평가하는 표현해야합니다 술어을 (즉, ON 키워드 뒤의 부분이라고 무엇)에 가입 (즉 참 또는 거짓). 그것은 두 테이블을 서로 연결하는 것입니다.


이 문제를 해결하는 방법을 배우려면 PostgreSQL tutorial on joins을 공부하는 것이 좋습니다. 링크 된 튜토리얼 (이 귀하의 질문에에 하지 테이블이 있습니다)이 PostgreSQL의 튜토리얼에서 예제 테이블을 사용하여 작동하는 방법의 예를 제공합니다

SELECT * 
FROM weather INNER JOIN cities ON (weather.city = cities.name); 

(weather.city = cities.name)는 "테스트"표현의 종류를 제공하는 방법을 참조하십시오 그 행의 각 조합에 대해 일치 여부를 확인하기 위해 실행할 수 있습니까?

원래 쿼리를 수정하는 방법을 이해할 수 있도록 조인의 작동 방식에 대해 설명합니다.

(단, psql 또는 PgAdmin-III와 같은 도구를 사용하여 코드를 대화식으로 테스트하는 것이 좋으며, 임의의 웹 기반 쿼리 도구보다 편리하고 더 나은 오류 메시지를 제공하는 경우가 많습니다.)

+0

위의 내용을 시도한 결과이 오류가 발생했습니다. 쿼리가 실패했습니다. 오류 : 테이블 "도시"에 대한 FROM 절 항목이 누락되었습니다. LINE 1 : ... kers FROM lab2.country AS co JOIN lab2.country ON lab2.city ...^ – asdf

+0

@asdf 쿼리를 다시 읽을 수 있도록 다시 포맷했습니다. 나는 그것을 고치지 않았다. 내 답변의 나머지 부분을 읽으십시오. 문제의 원인과 해결 방법을 설명합니다. 나는 너를 위해 숙제를하지 않겠지 만, 그 길을 따라 몇 가지 힌트를 드리겠습니다. –

+0

lab2.city.country_code를 lab2.city로 변경 했는데도 여전히 오류가 발생합니다. 내가 뭘 놓치고 있니? – asdf

관련 문제