【问题标题】:Query error when getting information from 2 different tables in php从php中的2个不同表获取信息时查询错误
【发布时间】:2014-09-19 11:15:10
【问题描述】:

对于我的家庭作业,我必须从有关世界的信息数据库中编写查询。我的一个查询中有一个错误,我不知道为什么。我遇到问题的查询的问题陈述是:

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

【问题讨论】:

标签: php postgresql


【解决方案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 表达式。你不能仅仅加入这样的价值。 join 谓词(即调用 ON 关键字之后的部分)必须是计算结果为 布尔值表达式(即是真还是假)。它将两个表链接在一起。


要了解如何解决这个问题,我建议您研究PostgreSQL tutorial on joins。链接教程提供了一个示例,说明如何使用 PostgreSQL 教程中的示例表(这些不是您问题中的表):

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

看看(weather.city = cities.name)如何提供一种“测试”表达式,可以对每个行组合运行以查看它们是否匹配?

希望这将解释连接的工作原理,以便您了解如何修复原始查询。

(顺便说一句,我强烈建议您习惯于在 psql 或 PgAdmin-III 之类的工具中以交互方式测试您的代码。它们比一些基于 Web 的随机查询工具更方便,并且通常会提供更好的错误消息.)

【讨论】:

  • 我试过你上面的说法,我得到这个错误查询失败:错误:缺少表“城市”第 1 行的 FROM 子句条目:...kers FROM lab2.country AS co JOIN lab2.country在 lab2.city.... ^
  • @asdf 我重新格式化了您的查询以使其可读。我没修。阅读我的其余答案,其中解释了它有什么问题以及如何自己修复它。我不会为你做功课,但我很乐意一路上给你一些提示。
  • 我将 lab2.city.country_code 更改为 lab2.city,但仍然出现错误。我错过了什么?
  • 等等,我什至在这个查询中使用城市表吗?现在我超级困惑哈哈,你能帮帮我吗?
  • @asdf 阅读我链接到的教程。如果您在研究后仍然卡住,并阅读我对您加入的on 子句问题的解释,请告诉我。请先花一个小时左右尝试使用文档和教程自己解决它。也许从 PostgreSQL 教程的开头开始会更容易:postgresql.org/docs/current/static/tutorial.html 因为它显示了示例表的创建。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多