2014-09-18 68 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