2016-06-17 14 views
1

Ich habe 3 Tabellen: usuaris, Versionen und usuari_versio für die Beziehung:MySQL 5.7: UNIQUE und existiert

id | usuari_id | versio_id | updated_at | created_at 

die folgende Abfrage, durch Laravel erzeugt, der Benutzer kehrt nur dann, wenn die erste Zeile der Beziehung hat versio_id = 2, wenn E-Mail eine UNIQUE-Einschränkung hat.

Wenn ich jedoch die UNIQUE-Einschränkung entfernen, gibt die Abfrage den Benutzer für jede versio_id-Beziehung (wie gewünscht) zurück.

Ich habe auch gesehen, dass, wenn statt E-Mail verwende ich usuaris. id, das ist PK, das gleiche Ergebnis mit E-Mail mit UNIQUE Constraint passiert.

select * 
from `usuaris` 
where 
    `usuaris`.`email` = '[email protected]' 
    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 

Ich verstehe nicht wirklich, warum das passiert. Aber ich muss den Benutzer holen, wenn die Unterabfrage true zurückgibt und auch wenn E-Mail (oder ID) übereinstimmt.

Danke.

EDIT:

Ich versuchte, das "=" der Unterabfrage zu ändern für ein "like" (ohne%) und arbeitet nun als ich erwartet hatte:

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

Es arbeitet auch wenn ich das "=" für ein "Gefällt mir" des E-Mail-Vergleichs ändere.

Warum passiert das?

Antwort

0
select * 
from usuaris usu 
where 
usuaris.email = '[email protected]' 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; 

Er sagt, dass Sie einen Benutzer sind die Auswahl, wo die E-Mail nur '[email protected]' ist, und wenn usuari_versio hat Version 2 in versio_id mit usuari_id in usuari_versio. Es kann zurückgegeben werden, wenn nur eine E-Mail "[email protected]" vorhanden ist. Aber wenn Sie mehr als eine "[email protected]" (nicht eindeutig) haben, wird es wahrscheinlich falsch sein. Das Limit 1 sagt, dass es den ersten Benutzer auswählt, der diese E-Mail hat.

kann mehr als eine Zeile zurückgeben, wenn die E-Mail nicht eindeutig oder primärer Schlüssel ist.

Vielleicht ein guter Weg, um es auszuwählen kann so sein (wenn E-Mail eindeutig ist)

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 = '[email protected]' and 
ver.id = 2 
LIMIT 1; 

, wenn nicht mit dem usuaris pk versuchen Suche

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 = '[email protected]' and 
    ver.id = 2 and 
    usu.id = USUARISPK; 
+0

Danke, aber ich bin mit Laravel Framework und ich kann die Abfrage nicht leicht ändern. – kanashin

+0

ow, tut mir leid :( –