Mysql "или" операнд сломан?
Я разместил это в стеке, но не получил никакого трафика:
У меня есть 2 веб-приложения (aspx/c#), настроенные на две базы данных. Программное обеспечение идентично.
Одна база данных-5.6, другая только что была обновлена до 5.7, и именно тогда возникла эта проблема
У меня есть модель entity framework баз данных mysql. Запрос выглядит следующим образом:
db.ldz_from_rec.GroupBy(l => l.region, (key, g) => g.OrderBy(l=>l.LDZ_Exit).FirstOrDefault());
результат из представления "ldz_from_rec" имеет около 14 уникальных "регионов", но загружает LDz в каждом регионе. Я просто хочу одну.
Вот sql EF плюет в mysql:
SELECT `Apply1`.`id`, `Apply1`.`REGION1` AS `region`, `Apply1`.`LDZ_Id`, `Apply1`.`LDZ_Exit` FROM (SELECT `Distinct1`.`region`, (SELECT `Project2`.`id` FROM `ldz_from_rec` AS `Project2` WHERE (`Distinct1`.`region` = `Project2`.`region`) OR ((`Distinct1`.`region` IS NULL) AND (`Project2`.`region` IS NULL)) ORDER BY `Project2`.`LDZ_Exit` ASC LIMIT 1) AS `id`, (SELECT `Project2`.`region` FROM `ldz_from_rec` AS `Project2` WHERE (`Distinct1`.`region` = `Project2`.`region`) OR ((`Distinct1`.`region` IS NULL) AND (`Project2`.`region` IS NULL)) ORDER BY `Project2`.`LDZ_Exit` ASC LIMIT 1) AS `REGION1`, (SELECT `Project2`.`LDZ_Id` FROM `ldz_from_rec` AS `Project2` WHERE (`Distinct1`.`region` = `Project2`.`region`) OR ((`Distinct1`.`region` IS NULL) AND (`Project2`.`region` IS NULL)) ORDER BY `Project2`.`LDZ_Exit` ASC LIMIT 1) AS `LDZ_Id`, (SELECT `Project2`.`LDZ_Exit` FROM `ldz_from_rec` AS `Project2` WHERE (`Distinct1`.`region` = `Project2`.`region`) OR ((`Distinct1`.`region` IS NULL) AND (`Project2`.`region` IS NULL)) ORDER BY `Project2`.`LDZ_Exit` ASC LIMIT 1) AS `LDZ_Exit` FROM (SELECT DISTINCT `Extent1`.`region` FROM `ldz_from_rec` AS `Extent1`) AS `Distinct1`) AS `Apply1`
В одной базе данных (5.6) он работает нормально, в другой (5.7) возвращает null для всех столбцов, но он выбирает 14 строк нулей.
Я проверил запрос по базам данных, чтобы подтвердить, что получал EF. Я обнаружил, что в БД, которая не работала, я мог бы изменить OR на и XOR, и это работает.
Смотрите мой пример:
select *, (SELECT `Project2`.`id` FROM `ldz_from_rec` AS `Project2` /* the next line returns results */ WHERE (`Distinct1`.`region` = `Project2`.`region`) XOR ((`Distinct1`.`region` IS NULL) AND (`Project2`.`region` IS NULL)) /* the next line does not return results */ /*WHERE (`Distinct1`.`region` = `Project2`.`region`) OR ((`Distinct1`.`region` IS NULL) AND (`Project2`.`region` IS NULL))*/ ORDER BY `Project2`.`LDZ_Exit` ASC LIMIT 1) AS `id` from (SELECT DISTINCT `Extent1`.`region` FROM `ldz_from_rec` AS `Extent1`) as `Distinct1` ;
Я понимаю, что строки являются нулевыми, потому что ни одна строка не была возвращена в подзапросах, но как тогда XOR находит строки, которые или не могут быть возвращены? Я не могу придумать ни одного примера, где XOR может вернуть больше того или: S
Это происходит не во всех случаях использования OR, но это согласуется в данном примере
Я схожу с ума?
MySql Сломан?
Как я могу это исправить?
Могу ли я лучше подставить свою ламду, чтобы избежать этого?
Спасибо ^_^ Энди
Что я уже пробовал:
select *, (SELECT `Project2`.`id` FROM `ldz_from_rec` AS `Project2` /* the next line returns results */ WHERE (`Distinct1`.`region` = `Project2`.`region`) XOR ((`Distinct1`.`region` IS NULL) AND (`Project2`.`region` IS NULL)) /* the next line does not return results */ /*WHERE (`Distinct1`.`region` = `Project2`.`region`) OR ((`Distinct1`.`region` IS NULL) AND (`Project2`.`region` IS NULL))*/ ORDER BY `Project2`.`LDZ_Exit` ASC LIMIT 1) AS `id` from (SELECT DISTINCT `Extent1`.`region` FROM `ldz_from_rec` AS `Extent1`) as `Distinct1` ;