Diskuze: dotaz na data z tří tabulek

Ostatní jazyky SQL SQL a databáze dotaz na data z tří tabulek

Aktivity (1)
Avatar
sexton
Člen
Avatar
sexton:9.1.2015 22:08

Ahoj, nevím si rady s dotazem v ASP.NET kdy chci zobrazit tabulku zobrazující uživatelské jméno a jeho roli.
Mám tři tabulky:
AspNetUsers kde jsou sloupce Id a UserName
AspNetUsersRoles kde jsou sloupce UserId a RoleId
AspNetRoles kde jsou sloupce Id a Name

Rád bych zobrazil tabulku kde bude zobrazeno UserName a Name
Zatím jsem vytvořil pouze dotaz který mi zobrazí UserName a RoleId
SELECT [UserName], [RoleId] FROM [AspNetUsers] LEFT JOIN [AspNetUserRoles] ON [Id] = [UserId] ORDER BY [RoleId]
Prosím o radu jak na to.

 
Odpovědět 9.1.2015 22:08
Avatar
Martin Konečný (pavelco1998):9.1.2015 23:48

Pokud má každý uživatel roli, pak bych to napsal nějak takto:

SELECT [UserName], [Name]
FROM [AspNetUsers]
INNER JOIN [AspNetUserRoles] ON [Id] = [UserId]
INNER JOIN [AspNetRoles] ON [roleId] = [Id] z tabulky AspNetUserRoles
ORDER BY [RoleId]

Nevím, jak se tu zapisují i názvy tabulek, když kolidují názvy sloupců. V PHP a MySQL by se to napsalo jako

`AspNetUsers`.`roleId`
 
Nahoru Odpovědět 9.1.2015 23:48
Avatar
sexton
Člen
Avatar
sexton:10.1.2015 10:36

Díky za nakopnutí, funguje mi toto
SELECT *
FROM [AspNetUserRoles]
INNER JOIN [AspNetUsers] ON [AspNetUserRo­les].[UserId] = [AspNetUsers].[Id]
INNER JOIN [AspNetRoles] ON [AspNetUserRo­les].[RoleId] = [AspNetRoles].[Id]

Nefunguje mi SELECT [UserName], [Name] tak jsem zatím dal SELECT *
Na to ještě musím přijít

 
Nahoru Odpovědět 10.1.2015 10:36
Avatar
Odpovídá na sexton
Michal Štěpánek:10.1.2015 10:48

Jen bych v tomto případě místo INNER JOIN použil LEFT OUTER JOIN, protože když tam bude uživatel, který nebude mít žádnou roli, tak ti to s innerem nezobrazí nic.
EDIT: A hlavně bys měl místo SELECT * použít konkrétní sloupce, které chceš zobrazit

Editováno 10.1.2015 10:51
Nahoru Odpovědět 10.1.2015 10:48
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
sexton
Člen
Avatar
Odpovídá na Michal Štěpánek
sexton:10.1.2015 11:39

Já vím, že bych měl zadat konkrétní sloupce, ale nedaří se mi najít správnou verzi zápisu.
Zkoušel jsme toto a vše bylo špatně
SELECT [Name],[UserName]
SELECT [UserId],[RoleId]
SELECT [AspNetUsers]­.[Id],[AspNet­Roles].[Id]
SELECT [AspNetUserRo­les].[UserId],[As­pNetUserRoles]­.[RoleId]
SELECT [AspNetRoles]­.[Name],[AspNe­tUsers].[User­Name]

 
Nahoru Odpovědět 10.1.2015 11:39
Avatar
Michal Štěpánek:10.1.2015 12:05

Např. za předpokladu, že každý uživatel MUSÍ mít přiřazenou nějakou budovu zobrazím informace o uživateli z tabulky AspNetUsers (kde je budova zadána jako ID budovy) a název budovy z tabulky Budovy

SELECT AspNetUsers.Id, AspNetUsers.LastName + ' ' + AspNetUsers.FirstName AS Jmeno, AspNetUsers.Email, AspNetUsers.Pracoviste, Budovy.BudovaNazev
FROM AspNetUsers
INNER JOIN Budovy ON AspNetUsers.BudovaId = Budovy.BudovaId
ORDER BY Jmeno

Kdyby budovu přiřazenou mít nemusel, místo INNER JOIN bych musel použít LEFT OUTER JOIN

Editováno 10.1.2015 12:06
Nahoru Odpovědět 10.1.2015 12:05
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na sexton
Michal Štěpánek:10.1.2015 12:07

zapomněl jsem dát "odpovědět"

Nahoru Odpovědět 10.1.2015 12:07
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na sexton
Martin Konečný (pavelco1998):10.1.2015 12:51

S jakou databází pracuješ?

 
Nahoru Odpovědět 10.1.2015 12:51
Avatar
sexton
Člen
Avatar
 
Nahoru Odpovědět 10.1.2015 16:16
Avatar
Odpovídá na sexton
Michal Štěpánek:10.1.2015 16:23

To, co jsem ti psal ti funguje?

Nahoru Odpovědět 10.1.2015 16:23
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
sexton
Člen
Avatar
sexton:10.1.2015 16:29

Nefunguje,
podle nastíněného postupu jsem vytvořil dotaz
SELECT [AspNetUsers]­.[UserName] AS [UserName], [AspNetRoles]­.[Name] AS [Name]
a nefunguje

 
Nahoru Odpovědět 10.1.2015 16:29
Avatar
Odpovídá na sexton
Michal Štěpánek:10.1.2015 16:53

Jednak je zbytečné psát ty hranaté závorky a hlavně ti tam chybí JOIN a taky nemáš z jaké tabulky chceš sosat...

Editováno 10.1.2015 16:53
Nahoru Odpovědět 10.1.2015 16:53
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
sexton
Člen
Avatar
Odpovídá na Michal Štěpánek
sexton:10.1.2015 17:42

Jasný vycházím z toho co mi fungovalo a snažím se nahradit hvězdičku u SELECTu jen sloupci které potřebuji.
Díky za upozornění, že závorky nejsou potřeba,
Takže celý dotaz je:
SELECT *
FROM AspNetUserRoles
INNER JOIN AspNetUsers ON AspNetUserRoles­.UserId = AspNetUsers.Id
INNER JOIN AspNetRoles ON AspNetUserRoles­.RoleId = AspNetRoles.Id

a v tabulce si vypíšu hodnoty UserName a Name. Takto mi to funguje.
Ale zbytečně ze serveru tahám celou tabulku.

 
Nahoru Odpovědět 10.1.2015 17:42
Avatar
Odpovídá na sexton
Martin Konečný (pavelco1998):10.1.2015 18:16

Něco takovýho nefunguje?

SELECT AspNetUsers.Name AS userName, AspNetRoles.Name AS roleName
FROM AspNetUserRoles
INNER JOIN AspNetUsers ON AspNetUserRoles.UserId = AspNetUsers.Id
INNER JOIN AspNetRoles ON AspNetUserRoles.RoleId = AspNetRoles.Id
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 10.1.2015 18:16
Avatar
sexton
Člen
Avatar
sexton:10.1.2015 22:42

Funguje, moc díky za pomoc.

 
Nahoru Odpovědět 10.1.2015 22:42
Avatar
Odpovídá na sexton
Martin Konečný (pavelco1998):10.1.2015 23:54

Nemáš zač. Možná by si body spíše zasloužil Michal.

 
Nahoru Odpovědět 10.1.2015 23:54
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 16 zpráv z 16.