Avatar billede 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..
Avatar billede 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.
Avatar billede 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 ?
Avatar billede arne_v Ekspert
29. april 2020 - 18:27 #3
Er konteksten ASP.NET med VB.NET som sprog?

Jeg kunne godt lave noget kode.
Avatar billede SommerFyr Seniormester
29. april 2020 - 18:37 #4
Jeps det er til asp.net og vb.net
Avatar billede 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
Avatar billede sukos Juniormester
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";
Avatar billede sukos Juniormester
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....
Avatar billede sukos Juniormester
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)
Avatar billede 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. Der sættes "nofollow" på alle links.

Loading billede 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