SommerFyr Seniormester
29. april 2020 - 16:08 Der er 7 kommentarer og
1 løsning

Menu Tree

Hej Jeg har love en ven at lave et menu tree men har lidt problem med min sql
som jeg ikke lige kan se mig ud af som jeg håber en vil hjælpe

min sql er som
MenuID INT(11)
MenuSub INT(11)
MenuTitle varchar(100)

Data
1 0 Menu1
2 0 Menu2
3 1 Menu1,1
4 1 Menu1.2
5 3 Menu1,1,1

men i sql driller mig lidt og har prøve med Grupe By men der får jeg så bare ikke menu2 med fordi der ikke er nåde under

skulle gerne se sådan ude

Menu1
-Menu1,1
--Menu1,1,1
-Menu1,2
Menu2

Håber en har en løsning..
arne_v Ekspert
29. april 2020 - 16:13 #1
Læs alle data ind i en træ data struktur og brug den - SQL er ikke godt til det her.
SommerFyr Seniormester
29. april 2020 - 16:28 #2
øv tænke bare at man kun læse det inde fra mysql og på den måde vise dem..
har du en anden måde du så vil anbefale ?
arne_v Ekspert
29. april 2020 - 18:27 #3
Er konteksten ASP.NET med VB.NET som sprog?

Jeg kunne godt lave noget kode.
SommerFyr Seniormester
29. april 2020 - 18:37 #4
Jeps det er til asp.net og vb.net
arne_v Ekspert
29. april 2020 - 19:34 #5
Den her kode skulle gerne illustrere teknikken (selvom det er en console app og ikke en ASP.NET app):


Imports System
Imports System.Collections.Generic

Imports MySql.Data.MySqlClient

Namespace E
    Public Class MenuItem
        Public Property Number As Integer
        Public Property Title As String
        Public ReadOnly SubMenu As IList(Of MenuItem) = New List(Of MenuItem)()
        Public Sub New(number As Integer, title As String)
            Me.Number = number
            Me.Title = title
        End Sub
    End Class
    Public Class Program
        Public Shared Sub SetUp()
            Using con As New MySqlConnection("Server=localhost;Database=Test;User Id=root;Password=")
                con.Open()
                Using cre As New MySqlCommand("CREATE TABLE menu (id INTEGER NOT NULL, parent_id INTEGER, title VARCHAR(32), PRIMARY KEY(id))", con)
                    cre.ExecuteNonQuery()
                End Using
                Using ins As New MySqlCommand("INSERT INTO menu VALUES(@id,@parent_id,@title)", con)
                    ins.Parameters.Add("@id", MySqlDbType.Int32)
                    ins.Parameters.Add("@parent_id", MySqlDbType.Int32)
                    ins.Parameters.Add("@title", MySqlDbType.VarChar, 32)
                    ins.Parameters("@id").Value = 1
                    ins.Parameters("@parent_id").Value = 0
                    ins.Parameters("@title").Value = "Menu 1"
                    ins.ExecuteNonQuery()
                    ins.Parameters("@id").Value = 2
                    ins.Parameters("@parent_id").Value = 0
                    ins.Parameters("@title").Value = "Menu 2"
                    ins.ExecuteNonQuery()
                    ins.Parameters("@id").Value = 3
                    ins.Parameters("@parent_id").Value = 1
                    ins.Parameters("@title").Value = "Menu 1.1"
                    ins.ExecuteNonQuery()
                    ins.Parameters("@id").Value = 4
                    ins.Parameters("@parent_id").Value = 1
                    ins.Parameters("@title").Value = "Menu 1.2"
                    ins.ExecuteNonQuery()
                    ins.Parameters("@id").Value = 5
                    ins.Parameters("@parent_id").Value = 3
                    ins.Parameters("@title").Value = "Menu 1.1.1"
                    ins.ExecuteNonQuery()
                End Using
            End Using
        End Sub
        Public Shared Function LoadMenu() As MenuItem
            Dim aux As IDictionary(Of Integer, MenuItem) = New Dictionary(Of Integer, MenuItem)()
            Dim root As New MenuItem(0, "<root>")
            aux.Add(0, root)
            Using con As New MySqlConnection("Server=localhost;Database=Test;User Id=root;Password=")
                con.Open()
                Using sel As New MySqlCommand("SELECT id,parent_id,title FROM menu", con)
                    Using rdr As MySqlDataReader = sel.ExecuteReader()
                        While rdr.Read()
                            Dim id As Integer = CInt(rdr("id"))
                            Dim parent_id As Integer = CInt(rdr("parent_id"))
                            Dim title As String = DirectCast(rdr("title"), String)
                            Dim menu As New MenuItem(id, title)
                            aux.Add(id, menu)
                            aux(parent_id).SubMenu.Add(menu)
                        End While
                    End Using
                End Using
            End Using
            Return root
        End Function
        Public Shared Sub PrintMenu(indent As String, menu As MenuItem)
            Console.WriteLine(indent & menu.Title)
            For Each onesubmenu As MenuItem In menu.SubMenu
                PrintMenu(indent & "    ", onesubmenu)
            Next
        End Sub
        Public Shared Sub TearDown()
            Using con As New MySqlConnection("Server=localhost;Database=Test;User Id=root;Password=")
                con.Open()
                Using drp As New MySqlCommand("DROP TABLE menu", con)
                    drp.ExecuteNonQuery()
                End Using
            End Using
        End Sub
        Public Shared Sub Main(args As String())
            SetUp()
            Dim root As MenuItem = LoadMenu()
            PrintMenu("", root)
            TearDown()
            Console.ReadKey()
        End Sub
    End Class
End Namespace
sukos Novice
02. maj 2020 - 22:53 #6
Bare en side bemærkning,
for år tilbage lavede jeg en side for en bar, hvor man kunne se hvilke slags varer man kunne købe, med min og max pris. Det var så i php til visning anyway,

$prissql = "SELECT a1.id, MIN(pris) as low, MAX(pris) as high
            FROM varegrupper as a1, varepriser as t1
            JOIN (vareliste as t2) ON (t2.prisgrp = t1.id)
            WHERE a1.id = t2.katgrp GROUP BY t2.katgrp";
sukos Novice
02. maj 2020 - 23:01 #7
Jajja, det er lørdag....
Der var jo så også lige den her:

$varesql = "SELECT t1.id, t1.navn as grpnavn, t2.id as idref, t2.varenavn, t2.katgrp
            FROM varegrupper as t1, vareliste as t2
            WHERE t1.id = t2.katgrp ORDER BY t1.sortering, t2.varenavn ASC";

Den første røg i et array, som jeg brugte til visning af næste query....
sukos Novice
02. maj 2020 - 23:05 #8
Og når jeg kikker på det nu, burde det kunne gøres mere simpelt.
Men det er stadig lørdag, og jeg vil sgu "tilbage ind i kampen". ( De dage du bruger mere vand på at lave kaffe end at gå i bad)
Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links

Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





Computerworld
For to år siden nedsænkede Microsoft 864 servere i Nordsøen: Nu er datacenteret på land igen - se resultatet her
Microsoft har efter to år hævet sit undervands-datacenter op af Nordsøen. Her er de erfaringer, selskabet har gjort sig.
CIO
Torben Fabrin og Arla måtte på få dage omstille hele deres produktion da coronaen ramte
Da coronaen ramte verden måtte mejerigiganten Arla på få dage omstille sin produktion. Samtidig voksede salget massivt til supermarkeder mens institutioner og restauranter gik næsten i stå. Hør hvordan Arla kom gennem krisen ved blandt andet være klar med realtime analytics.
Job & Karriere
På jagt efter et it-job i Jylland? Her er 10 stillinger fra Aabenraa til Aalborg, der ledige netop nu
Vi har fundet en række spændende stillinger til dig, der jagter et it-job. Her kan du vælge og vrage mellem ledige stillinger lige fra Aabenraa til Aalborg.
White paper
Sådan vinder de etablerede virksomheder med digital transformation
For virksomheder der forbereder sig på at gennemgå en digital transformation, hvor Customer Experience er en central faktor, så har der aldrig været mere på spil end nu. Digital disruption truer med at ændre måden legacy virksomheder driver forretning på. Etablerede virksomheder udfordres af nye virksomheder, som mestrer det hurtigt udviklende digitale landskab. Kunder forventer en nem oplevelse og de vil kunne drage nytte af de samme digitale kanaler, som de bruger til at kommunikere med venner og familie med, til at kommunikere med virksomheder. Denne guide har vi designet til at hjælpe Enterprise virksomheder, der er i de tidlige stadier af deres digitale transformation, de organisationer vi kalder Digital Transformers – til at forstå de bedste næste skridt baseret på deres unikke profiler og hjælpe dem med at benchmarke mod deres konkurrenter.