从php中的2个不同表获取信息时查询错误

时间:2014-09-18 23:57:43

标签: php postgresql

对于我的家庭作业,我必须从有关世界的信息数据库中编写查询。我的一个查询中出现错误,我无法弄清楚原因。我遇到问题的查询的问题陈述是:

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

1 个答案:

答案 0 :(得分: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等工具以交互方式测试代码。它们比基于随机网页的查询工具更方便,而且经常提供更好的错误消息。)