webForumDet fria alternativet

Returnerar nada

12 svar · 246 visningar · startad av Jesper T

Jesper TMedlem sedan nov. 20017 144 inlägg
#1

Denna returnerar inget fast den borde.
Vad är det för fel som är traigt?

select sp_title,sg_name from
site_pages sp, site_groups sg, user_groups ug, user_members um
where
sp.sp_gid = sg.sg_gid and 
ug.ug_sgid = sg.sg_gid and
ug.ug_umid = um.um_id and
um.um_id = 71
order by sp_title

site_pages
sp_id | sp_title | sp_gid

user_members
um_id | um_name

site_groups
sg_gid | sg_name

user_groups
ug_umid | ug_sgid

aasahMedlem sedan mars 20034 471 inlägg
#2

Re: Returnerar nada

Är du säker på att du har något lagrat på id 71 då?

Men varför krångla till saken i onödan? Skriv:

select sp_title,sg_name 
from site_pages sp, site_groups sg
where
sp.sp_gid = sg.sg_gid and sg.sg_gid = 71
order by sp_title

Eftersom sg_gid = um_id kan du ju lika bra göra tilldelningen direkt, så slipper du blanda in två hela tabeller i onödan.

Jesper TMedlem sedan nov. 20017 144 inlägg
#3

Jag kanske har beskrivit lite taskigt men det är så att användarna (user_members) är medlemmar i olika grupper, gruppens namn finns i tabellen/kolumnen (site_groups/sg_name) och medlemsskapet finns i tabellen user_groups. Och för att ex. lista alla sidor som user "71" har rättighet till så måste man väl ställa frågan ungefär som jag skrev?

aasahMedlem sedan mars 20034 471 inlägg
#4

Re: Returnerar nada

Alltså vad plockar du ut? Jo de två kolumnerna sp_title och sg_name
Var finns de? Jo i site_pages resp site_groups om jag förstod det rätt? Förutsatt att detta stämmer:

Vari ligger skillnaden mellan sp.sp_gid = sg.sg_gid = 71 och
sp.sp_gid = sg.sg_gid = ug.ug_sgid = um.um_id = 71?
Är de lika så är de lika.
Alltså tillför din jätte-sammanslagning av tabeller ingenting, däremot tar det prestanda.

Jesper TMedlem sedan nov. 20017 144 inlägg
#5

Det är möjligt att min sql-sats är fel men så här ligger det till:

Tabellen site_pages innehåller sidor med text, id och grupp-id
Tabellen site_groups innehåller namn och id på olika grupper som varje medlem kan "delta i".
Tabellen user_groups innehåller kopplingar mellan användare och grupper
Tabellen user_members innehåller användarnamn och användar-id.

Alltså, nu vill jag hämta alla sidor ifrån tabellen site_pages som användare nr71 "deltar i" (som definieras i tabellen user_groups)

aasahMedlem sedan mars 20034 471 inlägg
#6

Ok, få se om jag förstått rätt.

Tabellen site_pages innehåller sidor med text, id och grupp-id
Tabellen site_groups innehåller namn och id på olika grupper som varje medlem kan "delta i".
Tabellen user_groups innehåller kopplingar mellan användare och grupper
Tabellen user_members innehåller användarnamn och användar-id.

Alltså, nu vill jag hämta alla sidor ifrån tabellen site_pages som användare nr71 "deltar i" (som definieras i tabellen user_groups)

Om jag förstår dig rätt är de attribut som har samma färg nedan också attribut som hör ihop, dvs om de har samma värden så talar vi om samma gruppid resp userid?

site_pages
sp_id | sp_title | sp_gid

site_groups
sg_gid | sg_name

user_groups
ug_umid | ug_sgid

user_members
um_id | um_name

Under förutsättning att det är rätt och du bara är intresserad av att plocka ut info ur tabellerna site_pages och site_groups, skriv så här:

select sp_id, sp_title, sp_gid, sg_name
from site_pages P, user_groups G, site_groups S
where P.sp_gid = G.ug_sgid and
G.ug_umid = 71 and S.sg_gid = G.ug_sgid
order by P.sp_title

Det är bara om du även vill plocka ut info om medlemmen som du måste blanda in user_members.

@ndersMedlem sedan juni 200032 969 inlägg
#7

aasah skrev:

Det är bara om du även vill plocka ut info om medlemmen som du måste blanda in user_members.

Det håller jag inte med om. :)

Och för att ex. lista alla sidor som user "71" har rättighet till så måste man väl ställa frågan ungefär som jag skrev?

Jo, ungefär. Den frågan borde fungera. Om jag vore du skulle jag nog bryta ner frågan för att se var någonstans den går sönder, dvs vilken join som pajar.

Förresten; är det Access vi pratar om?

aasahMedlem sedan mars 20034 471 inlägg
#8

@nders skrev:

aasah skrev:

Det är bara om du även vill plocka ut info om medlemmen som du måste blanda in user_members.

Det håller jag inte med om. :)

Nehej. Varför inte det? :q Om vi vet nummret på användaren, och inte är intresserade av namnet kan vi lika lätt sätta ug_umid till 71 som att sägga att ug_umid = um_id som i sin tur är = 71.

@ndersMedlem sedan juni 200032 969 inlägg
#9

Nehej. Varför inte det?

Nu råkar det vara så här va, att du har rätt och jag har fel. :)

(efter många tankar och funderingar tror jag det i alla fall, men sql-frågan är dessvärre jättekladdig eftersom alla fält och tabeller heter snudd på likadant.)

mvh

Jesper TMedlem sedan nov. 20017 144 inlägg
#10

aasah, du verkar ha hajjat vad jag vill komma fram till. Det funkar. Tusen tack till dig.
@nders; tack du också, det är mySql i detta fall.
Eeehhh, en avslutande fråga... :r
Om jag även vill ta med alla sidor som har gruppid noll(0) alltså: P.sp_gid = 0 hur gör jag då för att inte få "dubbleringar" så att säga?
Denna returnerar på tok för många sidor i stället:

select sp_id, sp_title, sp_gid, sg_name 
from site_pages P, user_groups G, site_groups S
where 
(P.sp_gid = G.ug_sgid and
S.sg_gid = G.ug_sgid and
G.ug_umid = 71) [red]or P.sp_gid = 0[/red]
order by P.sp_title
Jesper TMedlem sedan nov. 20017 144 inlägg
#11

Eftersom att inte alla sidor (site_pages) finns med i "grupptilldelninen" (site_groups) så vill jag även att sidor med sp_gid=0 skall listas.
Hur skulle jag kunna få till det utan att få en massa dubletter(cross joins)?

Jesper TMedlem sedan nov. 20017 144 inlägg
#12

Här blir det inga dubletter men däremot så visas även sidor som tillhör grupper som medlemmen inte joinar:

select sp_id, sp_title, sp_gid, sg_name 
from site_pages as P
Left Join user_groups as G ON P.sp_gid = G.ug_sgid 
Left Join site_groups as S ON S.sg_gid = G.ug_sgid 
and G.ug_umid = 71 
order by P.sp_title
Jesper TMedlem sedan nov. 20017 144 inlägg
#13

Detta var ju inte lätt precis men nu har jag gjort så här:

select sp_id, sp_title, sp_gid, sg_name 
from site_pages P, user_groups G, site_groups S
where 
P.sp_gid = G.ug_sgid and
S.sg_gid = G.ug_sgid and
G.ug_umid = 71
Union all
select sp_id, sp_title, sp_gid, null
from site_pages
where sp_gid = 0 
order by sp_title

Och det returnerar det jag vill, men...
är det rätt/det bästa sättet?

127 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)