MYSQL (не) с ROW_NUMBER (), почему он возвращает различное количество строк - PullRequest
0 голосов
/ 16 октября 2019

У меня простой запрос:

SELECT 
  definitions.rowid, 
  chars, 
  ROW_NUMBER() OVER (ORDER BY chars, definitions.rowid) AS nr 
FROM definitions 
INNER JOIN words ON definitions.word = words.rowid 
WHERE definitions.valid = True 
HAVING chars > 20

на моем компьютере (intel) он возвращает 36k записей

, но на клиентском компьютере (ryzen 2990wx) он возвращает 99k записей (не работает -chars начинается с формы 1)

если я удаляю объединение, оно работает нормально на обоих компьютерах

если я удаляю row_number, оно также работает нормально на обоих компьютерах

, если я заменяю «имеющий»с "и" тоже работает нормально на обоих компьютерах

на обоих компьютерах одинаковые версии mysql (8.018) и одинаковые таблицы ...

У меня завтра презентация - мне нужнолюбые идеи

CREATE TABLE `definitions` (
    `rowid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `word` INT(10) UNSIGNED NULL DEFAULT NULL,
    `definition` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_polish_ci',
    `chars` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
    `difficult` TINYINT(3) UNSIGNED NULL DEFAULT '99',
    `islocked` BIT(1) NULL DEFAULT b'0',
    `valid` BIT(1) NULL DEFAULT b'0',
    PRIMARY KEY (`rowid`),
    INDEX `word` (`word`)
)
COLLATE='utf8_polish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=100038
;


CREATE TABLE `words` (
    `rowid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `word` VARCHAR(64) NULL DEFAULT NULL COLLATE 'utf8_polish_ci',
    `display` VARCHAR(64) NULL DEFAULT NULL COLLATE 'utf8_polish_ci',
    `difficult` TINYINT(4) UNSIGNED NULL DEFAULT NULL,
    `islocked` BIT(1) NULL DEFAULT NULL,
    `valid` BIT(1) NULL DEFAULT NULL,
    PRIMARY KEY (`rowid`),
    INDEX `word` (`word`),
    INDEX `display` (`display`)
)
COLLATE='utf8_polish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=57009
;

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

1 Ответ

0 голосов
/ 16 октября 2019

HAVING используется с GROUP BY для фильтрации агрегированных данных. В вашем случае вам просто нужно добавить символы HAVING> 20 в предложение WHERE как AND chars> 20

...