2014-09-18 69 views
1

從2個不同的表中獲取信息時,對於我的家庭作業我不得不從關於這個世界的信息的數據庫編寫查詢。我在其中一個查詢中遇到錯誤,我無法弄清楚原因。問題陳述了,我有麻煩的查詢是:查詢錯誤在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))。但是,在將來,當請求幫助做家庭作業時,請說它是作業。 – 2014-09-19 01:06:45

回答

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.countrylab2.city

更大的問題是在你的加入ON表達。你不能只加入一個這樣的值。 A 加入謂詞(這就是ON關鍵字被調用後的部分)必須是表達式,其計算結果爲布爾值(即爲true或false)。它將兩個表連接在一起。


要學會如何解決這個問題,我建議你學習PostgreSQL tutorial on joins。鏈接的教程提供瞭如何工作使用PostgreSQL教程的例子表的例子(這些不是你的問題表):

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

查看如何(weather.city = cities.name)提供了一種「試驗」表達的是可以針對每個行的組合運行以查看它們是否匹配?

希望這將解釋如何加入工作,這樣你就可以瞭解如何解決您的原始查詢。 (順便說一句,我強烈建議你習慣在psql或PgAdmin-III這樣的工具中交互式地測試你的代碼,它比一些隨機的基於Web的查詢工具更方便,並且通常會給出更好的錯誤消息。 )

+0

我試過你上面的語句,並且我得到這個錯誤查詢失敗:錯誤:缺少表「城市」的FROM-clause條目LINE 1:... kers FROM lab2.country AS co JOIN lab2.country ON lab2.city ...^ – asdf 2014-09-19 02:50:22

+0

@asdf我重新格式化了您的查詢以使其可讀。我沒有修復它。閱讀我的答案的其餘部分,它解釋了什麼是錯的,以及如何自己修復它。我不會爲你做你的功課,但我很樂意爲你提供一些提示。 – 2014-09-19 02:51:38

+0

我將lab2.city.country_code更改爲lab2.city,但仍然出現錯誤。我錯過了什麼? – asdf 2014-09-19 03:03:36