webForumDet fria alternativet

Ta resultatet av en fråga till en ny fråga

Databaser & SQL

15 svar · 536 visningar · startad av Rulle

Medlem sedan juni 2000166 inlägg
Frågan#1

Är lost nu, vill göra som följer:

select groupid from group_servers
where serverid = 18
and privilegeid = 111

svaret kan vara allt från 1 grupp till flera grupper

vill ta svaret, dvs alla groupid och köra

select groupnames from group_names
where groupid = 4
or groupid = 102 osv för att få fram gruppnamnen

samt detta för att få fram lite ytterliggare info

select groupid, channelid, privilegeid from group_channels
where groupid = 4
or groupid = 102

Hoppas ni hajjar vad jag menar.
Jag vill alltså köra en fråga och få ett resultat.
Ta det resultatet och peta in i nästa fråga.

Medlem sedan juni 20031 837 inlägg
#2

Här kommer ett utkast som kanske kan fungera.
Tänk på att gärna meddela vilken databas det rör sig om eftersom syntaxen kan variera.

select gs.groupid, gn.groupnames , gc.groupid, gc.channelid, gc.privilegeid 
from group_servers as gs
join groupnames as gn on gn.groupid = gs.groupid
join group_channels as gc on gc.groupid = gs.groupid
where gs.serverid = 18
and gs.privilegeid = 111
Medlem sedan sep. 2006867 inlägg
#3

Det borde bli

select gn.groupnames, gc.grooupid, gc.channelid, gc.privilegedid from group_names gn 
join group_channels gc on gn.groupid = gc.groupid where gc.groupid in 
(select groupid from group_servers where serverid = 18 and privilegeid = 111)

/red: Jaha, dubbeljoin kan man såklart göra ocskå :)

Medlem sedan juni 2000166 inlägg
#4

The_Hulk skrev:

Här kommer ett utkast som kanske kan fungera.
Tänk på att gärna meddela vilken databas det rör sig om eftersom syntaxen kan variera.

select gs.groupid, gn.groupnames , gc.groupid, gc.channelid, gc.privilegeid 
from group_servers as gs
join groupnames as gn on gn.groupid = gs.groupid
join group_channels as gc on gc.groupid = gs.groupid
where gs.serverid = 18
and gs.privilegeid = 111

Sorry SQL och tackar, men såg i svaret att jag vill exkludera en grupp, groupid = 72 ska inte tas med

Medlem sedan juni 2000166 inlägg
#5

headbug skrev:

Det borde bli

select gn.groupnames, gc.grooupid, gc.channelid, gc.privilegedid from group_names gn 
join group_channels gc on gn.groupid = gc.groupid where gc.groupid in 
(select groupid from group_servers where serverid = 18 and privilegeid = 111)

/red: Jaha, dubbeljoin kan man såklart göra ocskå :)

Tackar, men såg i svaret att jag vill exkludera en grupp, groupid = 72 ska inte tas med

Medlem sedan sep. 2006867 inlägg
#6

Rulle skrev:

Och här blev resultatet:
Msg 207, Level 16, State 3, Line 1
Invalid column name 'groupnames'.
Msg 207, Level 16, State 3, Line 1
Invalid column name 'grooupid'.
Msg 207, Level 16, State 3, Line 1
Invalid column name 'privilegedid'.

Det här betyder att kolumnnamnen heter något annat, jag ser nu tex att det står grooupid, med två o:n.

Både jag och hulken gav varsin lösningsidé, det är ju nästan självklart så att du måste skriva om den lite så att det passar din SQL-typ, vi har ju ingen aning om du kör MSSQL, Oracle, potgres, MySQL eller SQLite eller något annat. Det kan se olika ut i allihopa...

Felmeddelandet "invalid column name" måste du kunna tolka själv och rätta det som behövs, annars är du nog ute på väldigt djupt vatten :)

Medlem sedan juni 2000166 inlägg
#7

headbug skrev:

Det här betyder att kolumnnamnen heter något annat, jag ser nu tex att det står grooupid, med två o:n.

Både jag och hulken gav varsin lösningsidé, det är ju nästan självklart så att du måste skriva om den lite så att det passar din SQL-typ, vi har ju ingen aning om du kör MSSQL, Oracle, potgres, MySQL eller SQLite eller något annat. Det kan se olika ut i allihopa...

Felmeddelandet "invalid column name" måste du kunna tolka själv och rätta det som bnehövs, annars är du nog ute på väldigt djupt vatten :)

Ändrade lite stavningar och lite annat smått och fick det att lira, men som du ser så vill jag exkludera ett groupid, se ovan.

Medlem sedan sep. 2006867 inlägg
#8

Rulle skrev:

Ändrade lite stavningar och lite annat smått och fick det att lira, men som du ser så vill jag exkludera ett groupid, se ovan.

Aha, det är en baggis, skriv:

select gn.groupnames, gc.grooupid, gc.channelid, gc.privilegedid from group_names gn 
join group_channels gc on gn.groupid = gc.groupid where gc.groupid in 
(select groupid from group_servers where serverid = 18 and privilegeid = 111) 
and gc.groupid <> 72
Medlem sedan sep. 2006867 inlägg
#9

Förresten är det lite krångligt att kommuncera genom att redigera poster, skriv ett nytt meddelande i den här tråden istället, om du vill fråga mer :)

Medlem sedan juni 2000166 inlägg
#10

Tack för hjälpen och eftersom du sa att om jag hade fler frågor så fråga...

La till lite men fattar inte varför jag inte får någon träff alls:

select gs.groupid, gn.groupname , gc.groupid, gc.channelid, gp.description , gt.aliasservername
from group_servers as gs
join group_names as gn on gn.groupid = gs.groupid
join group_channels as gc on gc.groupid = gs.groupid
join server_info as gt on gt.serverid = gs.serverid
join privilege_info as gp on gp.privilegeid = gc.privilegeid

where gs.serverid = 18
and gs.privilegeid = 10011
and gp.privilegeid = 20008
and gp.privilegeid = 20004
and gc.groupid <> 72

alla privikoder har en descrition som är snyggare att få fram än siffrorna.
priviid 10011 finns bara i group_servers medans dom andra finns i group_channels, deras descrition finna allas i priviledge_info

Medlem sedan juni 20031 837 inlägg
#11

Du säger att gs.privilegeid ska vara 1001 samtidigt som den ska vara 20008 samtidigt som den ska vara 20004.

borde kanske vara så här istället:

select gs.groupid, gn.groupname , gc.groupid, gc.channelid, gp.description , gt.aliasservername
from group_servers as gs
join group_names as gn on gn.groupid = gs.groupid
join group_channels as gc on gc.groupid = gs.groupid
join server_info as gt on gt.serverid = gs.serverid
join privilege_info as gp on gp.privilegeid = gc.privilegeid

where gs.serverid = 18
and (gs.privilegeid = 10011
or gp.privilegeid = 20008
or gp.privilegeid = 20004)
and gc.groupid <> 72
Medlem sedan sep. 2006867 inlägg
#12

Rulle skrev:

and gp.privilegeid = 20008
and gp.privilegeid = 20004

Jag förstår hur du menar, tror jag, men koden ovan betyder att du kräver att gp.privilegeid ska vara 20008 samtidigt som det är 20004, vilket inte går.

Vill du ange en lista får du använda "IN" så att det blir:

select gs.groupid, gn.groupname , gc.groupid, gc.channelid, gp.description , gt.aliasservername
from group_servers as gs
join group_names as gn on gn.groupid = gs.groupid
join group_channels as gc on gc.groupid = gs.groupid
join server_info as gt on gt.serverid = gs.serverid
join privilege_info as gp on gp.privilegeid = gc.privilegeid

where gs.serverid = 18
and gs.privilegeid = 10011
and gp.privilegeid  in (20008, 20004)
and gc.groupid <> 72

Förutsatt att gs.privilegeid kan ha ett annat värde än gp.privilegeid. Är det istället så att dom tre privid:na hör ihop så sätt en join på dom också och så gör du om IN-listan så att alla tre värdena finns med där.

/red eller såsom hulken säger, att jag alltid ska klura på formuleringara :)

Medlem sedan juni 2000166 inlägg
#13

Kanske inte så lätt att förklara men ska försöka. Jag fick ju allt att fungera till en början, sen ville jag ha dit förklaringen på privilegeid istället:
groupid groupname groupid channelid privilegeid alias
102 hejhå 102 563 20008 server1
102 hejhå 102 564 20008 server1
102 hejhå 102 565 20008 server1

Dvs byta ut 20008 eller 20004 eller 10011 mot sina förklaringar.
Sägas kan att privlegeid 10011 finns bara i group_servers och dom andra två finns i group_channels.

(Hur gör man för att få in svaret i inlägget i en sån där ruta som ni fått in koden i?)

Medlem sedan juni 2000166 inlägg
#14

Sen kan man ju testa innan man skriver :)
Nu fungerar det som jag vill, lite kosmetika bara som jag fixar till.
Tack för hjälpen.

Medlem sedan juni 20031 837 inlägg
#15

om du hittat en lösning som fungerar så posta gärna den här så andra kan se hur de ska lösa liknande problem och acceptera det som slutgiltigt svar.

Har någon av oss andra postat lösningen så acceptera deras svar.

Medlem sedan sep. 2006867 inlägg
#16

Och man skriver [ kod ] koden här [ / kod ] fast utan mellanslag, så blir det i en ruta.

Om du går till avancerade alternativ för svar så ser du tre kod-tecken, ett för "kod", ett för "html" och den sista för "php". För HTML och PHP så blir det färglagt lite snyggt också.

264 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
118 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)