gpt4 book ai didi

MySQL 5.7 : UNIQUE and exists

转载 作者:行者123 更新时间:2023-11-30 22:17:15 25 4
gpt4 key购买 nike

我有 3 个表:usuaris、versions 和 usuari_versio 用于关系:

id | usuari_id | versio_id | updated_at | created_at

以下查询由 laravel 生成,仅当电子邮件具有 UNIQUE 约束时关系的第一行具有 versio_id = 2 时才返回用户。

但是,如果我删除 UNIQUE 约束,查询将返回关系中任何 versio_id 的用户(根据需要)。

我还看到,如果我不使用电子邮件,而是使用 usuaris.id,这是 PK,与具有 UNIQUE 约束的电子邮件的结果相同。

select * 
from `usuaris`
where
`usuaris`.`email` = 'mail@mail.com'
and exists (
select *
from `versions`
inner join `usuari_versio` on `versions`.`id` = `usuari_versio`.`versio_id`
where
`usuari_versio`.`usuari_id` = `usuaris`.`id`
and `versions`.`id` = 2
)
limit 1

我真的不明白为什么会这样。但是我需要在子查询返回 true 以及电子邮件(或 ID)匹配时获取用户。

谢谢。

编辑:

我尝试将子查询的“=”更改为“like”(没有 %),现在按预期工作:

...
and `versions`.`id` LIKE 2
...

如果我将“=”更改为电子邮件比较的“赞”,它也会起作用。

为什么会这样?

最佳答案

select * 
from usuaris usu
where
usuaris.email = 'mail@mail.com' and
EXISTS (
select ver.id from versions ver inner join usuari_versio usuver
on ver.id = usuver.versio_id
where usuver.usuari_id = usu.id
and ver.id = 2
)
limit 1;

它表示您正在选择一个电子邮件仅为“mail@mail.com”的用户,并且如果 usuari_versio 在 versio_id 中具有版本 2,在 usuari_versio 中具有 usuari_id。如果只有一个电子邮件“mail@mail.com”,它可以返回。但是,如果您有多个“mail@mail.com”(不是唯一的),则可能是错误的。 Limit 1 表示它将选择第一个拥有该电子邮件的用户。

select * 
from usuaris usu
where
usuaris.email = 'mail@mail.com

如果电子邮件不是唯一的或主键,则可以返回多行。

也许选择它的好方法可以是这样的(如果电子邮件是唯一的)

select * 
from usuaris usu inner join usuari_versio usuver
on usuver.usuari_id = usu.id
inner join versions ver
on usuver.versio_id = ver.id
where
usu.email = 'mail@mail.com' and
ver.id = 2
LIMIT 1;

如果没有尝试用 usuaris pk 搜索

select * 
from usuaris usu inner join usuari_versio usuver
on usuver.usuari_id = usu.id
inner join versions ver
on usuver.versio_id = ver.id
where
usu.email = 'mail@mail.com' and
ver.id = 2 and
usu.id = USUARISPK;

关于MySQL 5.7 : UNIQUE and exists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37875626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com