Andy Lanng Ответов: 0

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` ;

0 Ответов