Tjena! Det går inte, eller rättare sagt, jag har försökt flera gånger utan att komma på en bra lösning, men det är ju ingen garanti :) På rak arm kan jag komma på två mer eller mindre fula lösningar. Tjena! <Min meny ska vara oändlig i hierkier. Så den rekursiva versionen skulle inte funka. Om jag Hur menar du med att göra en rekursiv funktion i klienten? som sagt tidigare så är det nog svårt att göra direkt i databasen. Själv har jag gjort den lösningen genom en rekursiv funktion i PHP som hämtar först alla root-noder och sen för varje nod hämtar dess barn osv. Inte bara svårt. Det är omöjligt att göra det direkt i databasen. En rekursiv funktion krävs. Hur blir det om du kör: "Jag har funderat på om det skulle gå att läsa ner allt direkt och stoppa in i en array eller klasser och sen sortera det på det viset, men har ännu inte kommit längre än funderingar... " När jag kör: Ok tack då fick jag svar på att det var helt omöjligt...kändes som jag ville höra det. Okej nu är problemet löst, den är oändlig tack Per för den enkla men smarta funktionen.SQL - ORDER BY för dropmeny
Håller på att fixa lite med ett menysystem i PHP och MySql. Men har fått lite problem
med SQLen. Jag kan inte få ut ordningen rätt, har försökt med GROUP BY och HAVING
men kan inte få det att funka...
Så här ser min tabell ut
MenuID MenuName MenuOrder MenuParentID
1 Button 1 0 1
2 Button 2 1 2
3 Button 3 2 3
4 Sub button 1 0 1
5 Sub button 1 0 3
6 Sub button 1 0 4
Med denna uppställning så skulle jag enkelt vilja loopa ut det så här:
Button 1
Sub button 1
Sub button 1
Button 2
Button 3
Sub button 1
Vore väldigt tacksam ifall någon kunde hjälpa mig. Har suttit
ett tag nu och är helt knäckt...
Mvh
AddeSv: SQL - ORDER BY för dropmeny
1. En rekursiv funktion som först hämtar alla toppalternativ. För varje toppnivå frågar du sedan databasen efter alla child-noder, för varje child-nod hämtar du alla dess childs osv... Kräver många databasfrågor vid en stor meny...=/
2.Om man lägger till ett fält i databasen där man anger "utskriftsordningen" uppifrån och ner kan man lätt skriva ut hela menyn. I ditt fall.
1 Button 1
2 Sub button 1
3 Sub button 1
4 Button 2
5 Button 3
6 Sub button 1
/JohanSv:SQL - ORDER BY för dropmeny
Och tack för att du svara!
Trodde inte jag skulle få svar så här sent...
Är rätt komplicerat fast upplägget är ganska basic.
Min meny ska vara oändlig i hierkier. Så den rekursiva versionen skulle inte funka. Om jag
förstår dig rätt. Har gjort någon sådan förut men aldrig en som kan ha hur många steg som
helst..hehe har dock försökt.
Jag har ett order fält men det löser tyvärr inte mitt problem. Jag kommer att loopa
ut den som en DHTML meny med lager och sånt så då blir det lite rörigare..
Man ska kunna ordna en meny instans upp och ner i dess ordning.
Oj vad rörigt det blev.
Alltså såhär:
1_1 (0)
1_1_1 (0)
1_1_2 (1)
1_1_2_1 (0)
1_1_3 (2)
1_2 (1)
1_2_1 (0)
Hehe lite rörigt...alltså varje undermeny som fälls ut kan man ordna
varje knapp under just den menyn.
Jag har försökt med följande:
SELECT * FROM Menu GROUP BY MenuID HAVING MenuParentID=MenuID
Men det funka inte, vore ioförsig enkelt om den funka så...
Såg att jag gjort lite fel i min första fråga.
Här är ett annat rätt exempel:
MenuID MenuName MenuOrder MenuParentID
1 Button1 0 1
2 Sub Button1 0 1
3 Sub Button2 1 1
4 Sub Button1 0 3
5 Button2 0 4
6 Sub Button1 0 5Sv: SQL - ORDER BY för dropmeny
<förstår dig rätt. Har gjort någon sådan förut men aldrig en som kan ha hur många steg som
<helst..hehe har dock försökt.
Både rätt och fel...
SQL Server kan bara rekursivisera i 32 nivåer, men du kan ju göra en rekursiv funktion i klienten, bara dit resultat är lämpligt för det.
/mickeSv:SQL - ORDER BY för dropmeny
Just nu ser min fråga ut så här:
SELECT E.*
FROM Menu E LEFT OUTER JOIN Menu M
ON E.MenuParentID = M.MenuID
ORDER BY E.MenuOrder, M.MenuParentID
Den genererar nästan rätt! Dvs:
MenuID MenuParentID MenuOrder MenuName
1 1 0 Button 1
5 1 0 Sub button 1_1
7 5 0 Sub button 1_1_1
6 1 1 Sub button 1_2
8 5 1 Sub button 1_1_2
2 2 1 Button 2
Som du ser så skulle jag vilja att Sub button 1_1_2
hamnar under Sub button 1_1_1 så den kommer rätt i hierkin.
MenuID och MenuParentID skulle då genereras på följande sätt:
1 1
5 1
7 5
8 5
6 1
Vilket den inte gör med denna fråga.
Men ifall den här typen av frågor endast
kan ta 32 nivåer så blir det ju ändå inte som jag vill ha det. Fast det duger med 32 nivåer.
Hehe...vore konstigt ifall man vill ha mer?
Känns faktiskt som om det blir att köra massor med kod i PHP istället.
Ville helst undvika det då det kan bli rätt komplicerat.
Tycker det är märkligt att inga har lyckat göra en sådan fråga, kanske
helt enkelt inte går...
Hoppas du kan hjälpa mig! :)Sv: SQL - ORDER BY för dropmeny
Jag har funderat på om det skulle gå att läsa ner allt direkt och stoppa in i en array eller klasser och sen sortera det på det viset, men har ännu inte kommit längre än funderingar...
/P-ESv:SQL - ORDER BY för dropmeny
Känner man igen toppalternativen genom att deras MenuParentID är samma som deras egna MenuID? Får jag föreslå att du sätter MenuParentID till 0 i stället på dessa? Då kan du köra med
function skriv_meny($parentID = 0)
{
$sql = "SELECT MenuID, MenuName FROM Menu WHERE MenuParentID = $parentID ORDER BY MenuOrder ASC";
$res = mysql_query($sql) or die(mysql_error() . '<br>' . $sql);
if(mysql_num_rows($res) > 0) {
echo '<ul>';
while($rad = mysql_fetch_assoc($res)) {
echo '<li>', $rad['MenuName'];
skriv_meny($rad['MenuID']);
echo '</li>';
}
echo '</ul>';
}
}
För övrigt rekommenderas PHPportalen (http://www.phpportalen.net) för PHP- och MySQL-relaterade frågor.
Sv: SQL - ORDER BY för dropmeny
SELECT E.*
FROM Menu E LEFT OUTER JOIN Menu M
ON E.MenuParentID = M.MenuID
ORDER BY M.MenuParentID, E.MenuOrder
/mickeSv:SQL - ORDER BY för dropmeny
Jo jag har tänkt på ifall man skulle sortera allt i PHP istället. Men det känns jobbigt :)
Fast det kanske inte finns några andra alternativ just nu i MySQL...Sv:SQL - ORDER BY för dropmeny
SELECT E.*
FROM Menu E LEFT OUTER JOIN Menu M
ON E.MenuParentID = M.MenuID
ORDER BY M.MenuParentID, E.MenuOrder
Tyvärr så blir det inte rätt.
5 1
7 5
1 1
8 5Sv: SQL - ORDER BY för dropmeny
Då ger jag upp med databasen for now. Och fokuserar på PHP istället!
Tack så jättemycket för alla grymma svar!Sv:SQL - ORDER BY för dropmeny
Enklast är alltid svårast. :)
Så här vart det:
MYSQL
Tabell i rätt ordning från början, men skulle kunna se ur hur som helst i ordning.
MenuID MenuParentID MenuOrder MenuName
1 0 0 Button 1
5 1 0 Sub button 1_1
7 5 0 Sub button 1_1_1
8 5 1 Sub button 1_1_2
6 1 1 Sub button 1_2
2 0 1 Button 2
PHP
function CreateMenu($parentID=0)
{
$sql = "SELECT * FROM Menu WHERE MenuParentID = $parentID ORDER BY MenuOrder ASC";
$res = mysql_query($sql) or die(mysql_error() . '<br>' . $sql);
if(mysql_num_rows($res) > 0) {
while($rad = mysql_fetch_assoc($res)) {
$hasparent = mysql_query("SELECT MenuParentID FROM Menu WHERE MenuParentID = ".$rad['MenuID']);
if ($hasparent){
echo $rad['MenuName']."<br>";
CreateMenu($rad['MenuID']);
}else{
echo $rad['MenuName']."<br>";
}
}
}
}
Resultatet skulle bli med lite html för att skjuta ut subbarna:
Button 1
Sub button 1_1
Sub button 1_1_1
Sub button 1_1_2
Sub button 1_2
Button 2
Bra för alla er som vill göra en oändlig meny struktur eller liknande.
Nu blir det massor med DHTML..hehe
Happy! :)