Вопрос о MariaDB | запрос работает, когда индекс указан или игнорируется, но не может вернуть ожидаемые результаты, в противном случае | Почему это произошло? - PullRequest
0 голосов
/ 22 января 2020

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

SELECT *
FROM team t1
JOIN district_team t2 ON t1.school_name = t2.team_name
join district t3 ON t2.district_num = t3.districut_number
JOIN region_district t4 ON (t2.season = t4.season AND t3.districut_number = t4.district_num AND t4.region_num = 3);

SELECT result.school_name, result.region_num, result.season
FROM (SELECT * from team t1
JOIN district_team t2 ON t1.school_name = t2.team_name
join district t3 ON t2.district_num = t3.districut_number
NATURAL JOIN region_district t4)result
WHERE result.region_num = 3;


, но эти запросы не дают результатов, даже если первый запрос дает результаты в области 3.
queries that should do almost the same thing - return results that are from region 3

--- Схема таблиц в запросе ---

CREATE TABLE `team` (
    `school_name` VARCHAR(50) NOT NULL,
    `mascot_name` VARCHAR(50) NULL DEFAULT NULL,
    PRIMARY KEY (`school_name`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `district_team` (
    `district_num` INT(11) NOT NULL,
    `team_name` VARCHAR(50) NOT NULL DEFAULT '',
    `season` INT(11) NOT NULL,
    INDEX `district_fk` (`district_num`),
    INDEX `team_district_fk` (`team_name`),
    CONSTRAINT `district_fk` FOREIGN KEY (`district_num`) REFERENCES `district` (`districut_number`),
    CONSTRAINT `team_district_fk` FOREIGN KEY (`team_name`) REFERENCES `team` (`school_name`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `district` (
    `districut_number` INT(11) NOT NULL,
    PRIMARY KEY (`districut_number`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `region_district` (
    `district_num` INT(11) NOT NULL,
    `region_num` INT(11) NOT NULL,
    `season` INT(11) NULL DEFAULT NULL,
    INDEX `region_fk` (`region_num`),
    INDEX `district_region_fk` (`district_num`),
    CONSTRAINT `district_region_fk` FOREIGN KEY (`district_num`) REFERENCES `district` (`districut_number`),
    CONSTRAINT `region_fk` FOREIGN KEY (`region_num`) REFERENCES `region` (`region_number`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;

Кто-нибудь знает, почему это происходит или что здесь происходит? Может ли это быть проблемой кодировки символов?


UPDATE ---

Запрос работает, когда я сообщаю таблице, какой индекс использовать или игнорировать индекс , Таким образом, эти запросы дают ожидаемый результат -

SELECT *
FROM team t1
JOIN district_team t2 ON t1.school_name = t2.team_name
join district t3 ON t2.district_num = t3.districut_number
JOIN region_district t4 IGNORE INDEX(region_fk) ON (t2.season = t4.season AND t3.districut_number = t4.district_num AND t4.region_num = 3);

SELECT *
FROM team t1
JOIN district_team t2 ON t1.school_name = t2.team_name
join district t3 ON t2.district_num = t3.districut_number
JOIN region_district t4 use INDEX(region_fk) ON (t2.season = t4.season AND t3.districut_number = t4.district_num AND t4.region_num = 3);

Но этот запрос не

SELECT *
FROM team t1
JOIN district_team t2 ON t1.school_name = t2.team_name
join district t3 ON t2.district_num = t3.districut_number
JOIN region_district t4 ON (t2.season = t4.season AND t3.districut_number = t4.district_num AND t4.region_num = 3);

Кто-нибудь знает, почему это произойдет?

изображение выполнения вышеуказанного запроса

...