Ошибка запроса при получении информации из двух разных таблиц в 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 для получения данных из обеих таблиц. Вот две таблицы, которые используются. Спасибо за помощь заранее.

  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 

Related of "Ошибка запроса при получении информации из двух разных таблиц в php"

Я переформатировал ваш запрос, чтобы я мог его прочитать, но я не исправил проблемы. Вот как это выглядит с лучшим форматированием:

 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.city этого вам нужно вступить в lab2.country в lab2.city .

Большей проблемой является выражение ON в вашем соединении. Вы не можете просто присоединиться к такой ценности. Предикат соединения (это то, что называется после ключевого слова ON ), должно быть выражением, которое вычисляется в виде логического значения (т.е. является истинным или ложным). Это то, что связывает две таблицы вместе.


Чтобы узнать, как это решить, я предлагаю вам изучить учебник PostgreSQL о присоединениях . Связанный учебник содержит пример того, как это работает с использованием таблиц примеров из учебника PostgreSQL (это не таблицы в вашем вопросе ):

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

Посмотрите, как (weather.city = cities.name) предоставляет своеобразное «тестовое» выражение, которое может быть запущено для каждой комбинации строк, чтобы увидеть, соответствуют ли они или нет?

Надеюсь, это объяснит, как работают соединения, чтобы вы могли понять, как исправить ваш исходный запрос.

(Кстати, я настоятельно рекомендую вам привыкнуть к тестированию вашего кода в интерактивном режиме в таком инструменте, как psql или PgAdmin-III. Они более удобны, чем некоторые случайные веб-инструменты для запросов, и часто дают лучшие сообщения об ошибках.)