evilaidMedlem sedan apr. 2009433 inlägg Rubriken kanske inte säger så mycket men...
Tänkte så här: har följande fält i en tabell
Id section_id relation_id
Nu vill jag hämta all med samma section_id men också för varje rad veta om det finns en post i frågan som har ett relation_id som är samma som Id.
Alltså följande exempel:
db_meny
Id section_id relation_id Heading
1 10 NULL Spik
2 10 NULL Skruv
3 10 NULL Mutter
4 10 NULL Nit
5 10 2 Långa skruv
så i ovan vill jag skriva ut alla poster utom den med id=5 men jag vill ändå få med den när jag skriver ut posten med id=2 ..
Jag försöker mig på att skriva ut en meny baserad på innehållet i en databas och har relation_id ett värde så innebär det att det finns en undermeny till just den posten? så i ovan blir blir långa skruv ett undermeny objekt till skruv..
Använder MSSQL
Mvh
Vet inte om jag kanske inte var så tydlig nu?
newseedMedlem sedan maj 2010117 inlägg Genom att namnge en tabell kan du använda den flera gånger i samma uttryck.
Exempel:
select
m1.[id],
count(*) as [n]
from
db_meny m1 left outer join db_meny m2 on (m1.[id] = m2.[relation_id])
where
m1.[section_id] = 10
group by
m1.[id]
I ovanstående exempel får du ut en lista över alla "huvud alternativ" med en summering hur många menyalternativ där finns för varje rad (1 = endast huvudet själv).
OBS, jag har inte testat koden utan bara skrivit den här men det borde fungera ungefär som jag skrivit.
aasahMedlem sedan mars 20034 471 inlägg Du kan antingen åstadkomma det med 2 frågor eller med en beroende på hur infon ska användas.
-- Ta fram menygrupperna
SELECT
Id,
section_id,
Heading
FROM
db_meny
WHERE
relation_id IS NULL
-- När du skriver ut menygrupperna så anropar du i tur och ordning följande:
SELECT
Id,
section_id,
relation_id,
Heading
FROM
db_meny
WHERE
relation_id = $section_id -- om nuvarande section_id lagrats i variabeln $section_id
-- Vi lägger till en rad i din tabell för exemplets skull
1 10 NULL Spik
2 10 NULL Skruv
3 10 NULL Mutter
4 10 NULL Nit
5 10 2 Långa skruv
5 10 2 Rundskruv <---
-- ELLER som en fråga där all info kommer ut ihop
SELECT
M.Id,
M.section_id,
M.Heading,
S.Id,
S.section_id,
S.Heading
FROM
db_meny M -- Huvudmeny
LEFT JOIN db_meny S ON S.relation_id = M.Id -- Submeny
WHERE
M.relation_id IS NULL
Detta genererar följande rader:
M.Id, M.section_id, M.Heading, S.Id, S.section_id, S.Heading
1 10 Spik NULL NULL NULL
2 10 Skruv 2 10 Långa skruv
2 10 Skruv 2 10 Rundskruv
3 10 Mutter NULL NULL NULL
4 10 Nit NULL NULL NULL
Om S.Id är NULL ==> submeny saknas
Om S.Id innehåller något så får du tag i allt som hör till den här huvudmenydelen
genom att fortsätta titta på nästa rad så länge S.Id = det M.Id som du för tillfället
håller på med. Men detta fixas bäst i den kod som tar emot resultatet.
evilaidMedlem sedan apr. 2009433 inlägg Newsseed: ska prova ditt exempel, har aldrig gjort så innan. Förstod inte riktigt men ska prova mig fram, men det är lite så som jag tänkt för då kan jag bara kolla om n är större än 1 och då göra menyalternativet expanderbart..
aasah: Ditt första exempel är jag med på, tänkte så också. Men sen i andra exemplet är jag inte med riktgit med på. Dock tror jag det är lite så jag tänkt fast jag vill bara få med de tre poster där S.Id = NULL fast istället få med ett fält där det anger om det finns "underposter" för då vet jag om det objektet ska vara klickbart för att se undermeny..
Vad tror nu allmänt om detta sätt att skriva ut menyer, blir det stor belasting när man ställer massa SQL frågor för att skriva ut varje sida.. det blir ju ett par frågor frågor bara för att skriva ut menyn sen kör jag också ett par frågor för att skriva ut artiklar under varje artikel. Hur snål ska man vara med SQl frågor.. Hade en idé om att skriva ut hela menyn i en XML fil eller nåt sånt och sen bara inkludera den i varje sida.. Och varje gång man ändrar meny delen så skrivs det ut en ny menyfil??
Har ni några andra idéer eller förslag på hur man ska göra det??
Tusen tack för era exempel..
aasahMedlem sedan mars 20034 471 inlägg
evilaid skrev:
aasah: Ditt första exempel är jag med på, tänkte så också. Men sen i andra exemplet är jag inte med riktgit med på. Dock tror jag det är lite så jag tänkt fast jag vill bara få med de tre poster där S.Id = NULL fast istället få med ett fält där det anger om det finns "underposter" för då vet jag om det objektet ska vara klickbart för att se undermeny..
Det andra exemplet får ut all info samtidigt. Om du skriver hela menyn i ordningen:
Spik
Skruv
--- Långa skruv
--- Rundskruv
Mutter
Nit
Kan det vara en fördel för då kan du direkt se i resultatset:et om det finns submenyer och vilka dessa är.
Om du däremot först tar fram huvudmenyn:
Spik
Skruv
Mutter
Nit
och sedan går in på submenyerna för en given huvudgrupp, så är alternativ 1 antagligen enklare.
Eftersom jag inte vet vilket serverside-skriptspråk som ska ta hand om resultatet blev det lite svårt att inkludera den omhändertagande koden i exemplet.
evilaid skrev:
Vad tror nu allmänt om detta sätt att skriva ut menyer, blir det stor belasting när man ställer massa SQL frågor för att skriva ut varje sida.. det blir ju ett par frågor frågor bara för att skriva ut menyn sen kör jag också ett par frågor för att skriva ut artiklar under varje artikel. Hur snål ska man vara med SQl frågor.. Hade en idé om att skriva ut hela menyn i en XML fil eller nåt sånt och sen bara inkludera den i varje sida.. Och varje gång man ändrar meny delen så skrivs det ut en ny menyfil??
Så länge du inte har ett gräsligt stort antal sidladdningar per tidsenhet på din sida och en gigantisk databas så är ett par frågor mer eller mindre helt oväsentligt. (Givet att din databas har en vettig struktur samt att du har lite koll på hur man skriver SQL-frågor. Skulle det ta jättelång tid är det nästan säkert något fel på SQL-frågan.)
Att ladda menyn från databasen är det klart bättre alternativet. Då räcker det att ändra i databasen för att ändringen omedelbart ska slå igenom på alla sidor. Att generera en fil med menyn innebär att du alltid måste uppdatera menyändringar på minst två ställen: i databasen + filen. Som gjort för att trassla...
Sedan, som sagt, kan du lugnt ha åtskilliga andra SQL-frågor med innehållet ändå. :)
evilaidMedlem sedan apr. 2009433 inlägg Andra exemplet blir ju klockrent om jag vill skapa en xml fil med menyn. Dock gör jag inte det nu . Men man kan ju då bara göra ett script som skriver ut en ny xml varje gång någon ändrar menyerna via admin gränssnittet. Alltså helt automatiserat. :)
jag använder gamla traditionella asp för script.
Tack för all info, nu kanske jag kan ta mig vidare...
evilaidMedlem sedan apr. 2009433 inlägg Undrar om det går få liv i denna tråd igen?
Jo det andra exemplet fungerar ju kanon där man får ut fäöljande resultat men hur gör man om man har en tredje nivå? alltså en undermeny till en annan undermeny?
Spik
Skruv
--- Långa skruv
--- ----guld belagd
--- ----Silver belagd
--- Rundskruv
Mutter
Nit
detta får jag inte att fungera?
Mvh
LarsGMedlem sedan dec. 200012 464 inlägg Sök lite på CTE och SQL server
evilaidMedlem sedan apr. 2009433 inlägg Lars: gogolade lite på CTE, min förståelse och kunskap om detta är begränsad. Men tror du det är den lösning som gäller eller finns det andra alternativ?
Ingen som gjort någon databas baserad meny? Tyckte min struktur verkade vettig men jag kanske tänker helt fel??
Tacksam för förslag då jag gärna vill kunna få igång undermenyer (blir lite mer gångbart då)..
Hittade denna länken http://sqlblog.nl/sv/Artikelen/T-SQL/recursieve-query-met-cte.html
här görs det precis som jag tänkt mig. Men jag fattar inget av koden dom beskriver, använder massa svenska uttryck?
Mvh