2016-03-29 8 views
0

Ich habe eine Abfrage wie folgt aus:Mehrere und auf INNER JOIN?

SELECT Email 
FROM minisecurity.my_aspnet_membership m   
INNER JOIN minisecurity.my_aspnet_details t ON t.id = m.userId   
INNER JOIN minisecurity.my_aspnet_usersinroles r ON m.userId = r.userId and r.roleId = '7'   
WHERE t.customerid = '2' 

Bei meinem zweiten INNER JOIN ich so filtern möchten, dass ich ein Ergebnis bekommen, wo RoleID entweder 6 oder 7

ich beide

INNER JOIN minisecurity.my_aspnet_usersinroles r 
    ON m.userId = r.userId and r.roleId = '7' and r.roleId = '6' 
versucht

und

INNER JOIN minisecurity.my_aspnet_usersinroles r 
    ON m.userId = r.userId and r.roleId = '7' or r.roleId = '6' 

aber beide kehrt w rong Ergebnis.

Wie wird das richtig gemacht?

+0

einige Beispieldaten zur Verfügung, und erwartete Ergebnis aus diesen Beispieldaten. –

+0

Was ist der Unterschied zwischen einem Kunden und einem Benutzer? – Strawberry

Antwort

0

AND hat precedence über OR, also was Sie wollen, ist:

INNER JOIN ... ON m.userId = r.userId and (r.roleId = '7' or r.roleId = '6') 
+0

Danke Guido! – Andy

1

prüfen unten query-

SELECT Email 
FROM minisecurity.my_aspnet_membership m   
INNER JOIN minisecurity.my_aspnet_details t ON t.id = m.userId   
INNER JOIN minisecurity.my_aspnet_usersinroles r ON m.userId = r.userId  
WHERE t.customerid = 2 and r.roleId in (6,7); 

können Sie auch OR verwenden, aber in stärker optimiert als OR-

SELECT Email 
FROM minisecurity.my_aspnet_membership m   
INNER JOIN minisecurity.my_aspnet_details t ON t.id = m.userId   
INNER JOIN minisecurity.my_aspnet_usersinroles r ON m.userId = r.userId  
WHERE t.customerid = 2 and (r.roleId=6 OR r.roleId=7); 

Hinweis: Wie Sie INNER JOIN verwenden, so dass Sie zusätzliche Bedingung verwenden können entweder mit on-Klausel oder where-Klausel.

Dank @strawberry für die Bearbeitung, um die Antwort besser zu machen.

@Andy: Erdbeere entfernt '' nach Berücksichtigung, dass diese Felder Integer-Typ und nicht Char/Varchar-Typ sind, aber wenn ein Feld nicht Integer ist dann muss ''.

+0

Ich bezweifle, dass IN ist mehr optimiert als OR. Der Vergleich von ganzen Zahlen mit ganzen Zahlen ist jedoch besser als der Vergleich von Strings mit ganzen Zahlen. – Strawberry

+0

@Strawberry: Im Moment habe ich kein Dokument, um es zu unterstützen, aber meine Erfahrung ist, dass MySQL Index besser mit In-Klausel als OR verwendet. –

+0

Danke Zafar! – Andy