SQL Ошибка запроса JOIN обеспечивает неточный возврат - PullRequest
0 голосов
/ 22 апреля 2020

Я потратил часы на поиск этой конкретной проблемы c на сайте, хотя многие из них близки и не решают ее полностью. Пожалуйста, свяжите его, если он существует, и я с удовольствием рассмотрю этот вопрос.

У меня есть две таблицы wb_states и wb_cities , которые можно увидеть по клавишам:

composite state_code+country_code & city_id являются отличительными для соответствующих таблиц.

enter image description here

ЦЕЛЬ: запустить запрос JOIN, чтобы получить state_name из таблицы wb_states (вместо кода состояния)

Я всегда получаю sql_mode = only_full_group_by ОШИБКА, если я не использую следующие

SELECT ANY_VALUE(c.city_id) as id, 
       ANY_VALUE(c.city_ascii) as ci,
       ANY_VALUE(s.state_name_ascii) as ps, 
       ANY_VALUE(c.country_code) as co
       FROM wb_cities AS c
       JOIN wb_states AS s ON
       s.state_code=c.state_code
       WHERE c.city_ascii like  'aa%' GROUP BY id ORDER BY co,ps,ci ASC

Конечно, запрос работает, но в тот момент, когда мы используем ANY_VALUE, он не работает.

Уникальный идентификатор 2959927 - город Aalen принадлежит только одной провинции Baden-Wurttemberg. Как вы строите этот запрос? Спасибо.

enter image description here

CREATE TABLE `wb_cities` (
  `city_id` int(11) NOT NULL,
  `city_name` varchar(65) DEFAULT NULL,
  `city_ascii` varchar(65) DEFAULT NULL,
  `state_code` varchar(55) DEFAULT NULL,
  `state_name_ascii` varchar(45) DEFAULT NULL,
  `country_code` varchar(45) DEFAULT NULL,
  `country_full` varchar(55) DEFAULT NULL,
  `lat` varchar(45) DEFAULT NULL,
  `lon` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`city_id`)
)

CREATE TABLE `wb_states` (
  `id` int(11) DEFAULT NULL,
  `state_code` varchar(10) NOT NULL,
  `state_name` varchar(45) DEFAULT NULL,
  `state_name_ascii` varchar(45) DEFAULT NULL,
  `country_code` varchar(45) NOT NULL,
  PRIMARY KEY (`state_code`,`country_code`)
)

INSERT INTO `wb_cities` VALUES (14256,'Āzādshahr','Azadshahr','09','Hamadan','IR','Iran','34.79049','48.57011'),(18918,'Protaras','Protaras','01','Famagusta','CY','Cyprus','35.0125','34.05833'),(23814,'Kahrīz','Kahriz','13','Kermanshah','IR','Iran','34.3838','47.0553'),(24851,'Nūrābād','Nurabad','23','Lorestan','IR','Iran','34.0734','47.9725'),(32723,'Īstgāh-e Rāh Āhan-e Garmsār','Istgah-e Rah Ahan-e Garmsar','25','Semnan','IR','Iran','35.23455','52.30942'),(32767,'Qarchak','Qarchak','26','Tehran','IR','Iran','35.42867','51.57544'),(32909,'Shahre Jadide Andisheh','Shahre Jadide Andisheh','26','Tehran','IR','Iran','35.6803','51.0193'),(41210,'Khorramdarreh','Khorramdarreh','36','Zanjan Province','IR','Iran','36.20898','49.19152'),(50672,'Wanlaweyn','Wanlaweyn','14','Shabeellaha Hoose','SO','Somalia','2.6185','44.8938'),(52867,'Qoryooley','Qoryooley','14','Shabeellaha Hoose','SO','Somalia','1.78784','44.52999');

INSERT INTO `wb_states` VALUES (29,'00','Armenia','Armenia','AM'),(11,'00','Aruba','Aruba','AW'),(15,'00','Bosnia and Herzegovina','Bosnia and Herzegovina','BA'),(31,'00','Botswana','Botswana','BW'),(7,'00','Belarus','Belarus','BY'),(23,'00','Cook Islands','Cook Islands','CK'),(39,'00','Christmas Island','Christmas Island','CX'),(4,'00','Czech Republic','Czech Republic','CZ'),(17,'00','Western Sahara','Western Sahara','EH'),(10,'00','Falkland Islands (Islas Malvinas)','Falkland Islands (Islas Malvinas)','FK'),(26,'00','Abkhazia','Abkhazia','GE'),(27,'00','Ghana','Ghana','GH'),(37,'00','Gibraltar','Gibraltar','GI'),(3,'00','Equatorial Guinea','Equatorial Guinea','GQ'),(16,'00','South Georgia and The South Sandwich Islands','South Georgia and The South Sandwich Islands','GS'),(28,'00','Hong Kong','Hong Kong','HK'),(6,'00','Indonesia','Indonesia','ID'),(8,'00','Ireland','Ireland','IE'),(32,'00','Kyrgyzstan','Kyrgyzstan','KG'),(36,'00','Comoros','Comoros','KM'),(34,'00','Muḩāfaz̧atalWafrah','MuhafazatalWafrah','KW'),(19,'00','Zhezqazghan Oblysy','Zhezqazghan Oblysy','KZ'),(21,'00','Lithuania','Lithuania','LT'),(40,'00','Monaco','Monaco','MC'),(13,'00','Montenegro','Montenegro','ME'),(9,'00','Mali','Mali','ML'),(5,'00','Macedonia','Macedonia','MO'),(35,'00','Mauritius','Mauritius','MU'),(25,'00','Malaysia','Malaysia','MY'),(41,'00','Norfolk Island','Norfolk Island','NF'),(30,'00','Bāgmatī Zone','Bagmati Zone','NP'),(2,'00','Niue','Niue','NU'),(14,'00','Panama','Panama','PA'),(22,'00','Philippines','Philippines','PH'),(42,'00','Palestine','Palestine','PS'),(43,'00','Serbia','Serbia','RS'),(24,'00','Swaziland','Swaziland','SZ'),(20,'00','Turks and Caicos Islands','Turks and Caicos Islands','TC'),(33,'00','Turkmenistan','Turkmenistan','TM'),(38,'00','Turkey','Turkey','TR'),(12,'00','British Virgin Islands','British Virgin Islands','VG'),(18,'00','Zimbabwe','Zimbabwe','ZW'),(164,'01','Abū Z̧aby','Abu Zaby','AE'),(90,'01','Badakhshan','Badakhshan','AF'),(112,'01','Barbuda','Barbuda','AG'),(118,'01','Aragatsotn','Aragatsotn','AM'),(124,'01','Benguela','Benguela','AO'),(45,'01','Buenos Aires','Buenos Aires','AR'),(146,'01','Burgenland','Burgenland','AT');

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Ваша модель данных повреждена. Вот два определения state_code:

`state_code` varchar(55) 
`state_code` varchar(10)

И все же это часть необъявленных отношений внешнего ключа.

Я думаю, что это проблема root:

PRIMARY KEY (`state_code`, `country_code`)

Предположительно, ID уникален, поэтому вы должны иметь:

CREATE TABLE `wb_states` (
  `state_id` int(11) DEFAULT PRIMARY KEY,
  `state_code` varchar(10) NOT NULL,
  `state_name` varchar(45) DEFAULT NULL,
  `state_name_ascii` varchar(45) DEFAULT NULL,
  `country_code` varchar(45) NOT NULL,
  `country_full` varchar(55) DEFAULT NULL,
  UNIQUE (`state_code`,`country_code`)
);

Тогда, Ваша таблица wb_cities может быть соответствующим образом определена следующим образом:

CREATE TABLE `wb_cities` (
  `city_id` int(11) NOT NULL PRIMARY KEY,
  `city_name` varchar(65) DEFAULT NULL,
  `city_ascii` varchar(65) DEFAULT NULL,
  `state_id` int DEFAULT NULL,
  `lat` varchar(45) DEFAULT NULL,
  `lon` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`city_id`),
  FOREIGN KEY (state_id) REFERENCES wb_states(state_id)
);

Возможно, у вас также должна быть таблица "стран", но, по крайней мере, страна может go в таблице "состояний", а не Таблица «городов».

Затем информацию о «состоянии» можно найти с помощью state_id.

После того, как вы исправили модель данных, вы можете подумать о том, чтобы исправить запрос.

1 голос
/ 22 апреля 2020

Вы присоединяетесь wb_cities к wb_states только на state_code, но вам также следует использовать country_code, поскольку state_code не уникален в wb_states. Также я не вижу причин для агрегации. Вам нужно только объединение таблиц:

SELECT c.city_id id, 
       c.city_ascii ci,
       s.state_name_ascii ps, 
       c.country_code co
FROM wb_cities AS c JOIN wb_states AS s 
ON s.state_code=c.state_code AND s.country_code = c.country_code
WHERE c.city_ascii like  'aa%' 
ORDER BY co, ps, ci 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...