19. april 2019 - 21:44Der er
33 kommentarer og 1 løsning
Kunsten af få data ud i korrekt rækkefølge
Hejsa
Jeg er ved at lave en dynamisk menu med undermenuer.
Jeg vil derfor gerne hive menupunkterne ud i korrekt rækkefølge.
Lige nu har jeg En SortOrder og en Parent. Parent står til 0 ved alle "hovedmenupunkter", ved undermenupunkter står Parenti til et hovedmenupunkts MenuID. Eks. Navn, MenuID, SortOrder, Parent Log ud, 0, 0, 0 Kundeoversigt, 1, 1, 0 Opret Kunde, 2, 0, 1 Maskinoversigt, 3, 2, 0 Opret Maskine, 4, 0, 3
De to Opret rækker er undermenuer.
Lige nu ser min SQL således ud: SELECT DISTINCT a.MenuID, a.MenuName, a.MenuLink, a.MenuVisible, a.MID, a.Parent, b.FieldName, b.DefaultText, b.'.$LangNameColName.' FROM '.MenuTable.' AS a, '.LanguageTextsTable.' AS b WHERE a.MenuName = b.DefaultText AND (b.FieldName LIKE "Menu%") ORDER BY a.SortOrder, a.Parent
Men problemet er, at alle undermenupunkter kommer ud sammen (under første hovedmenupunkt med undermenuer)
Hmm, hvis jeg gør således: '.MenuTable.' a1 JOIN '.MenuTable.' a2 on a1.menuid = a2.parent AS a
Kommer denne fejl: Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS a, PoC_LanguageTexts AS b WHERE a.MenuName = b.DefaultText AND ' at line 2
Hvis jeg fjerner "as a", skal jeg rette a til a1/a2 alle steder...
Huh? Nu kommer der kun 4 ud af 12 menupunkter ud??
Så er vi tilbage til det oprindelige resultat. :-/
SELECT DISTINCT a1.MenuID, a1.MenuName, a1.MenuLink, a1.MenuVisible, a1.MID, a1.Parent, b.FieldName, b.DefaultText, b.'.$LangNameColName.' FROM '.MenuTable.' a1 LEFT JOIN '.MenuTable.' a2 on a1.menuid = a2.parent, '.LanguageTextsTable.' AS b WHERE a1.MenuName = b.DefaultText AND (b.FieldName LIKE "Menu%") ORDER BY a1.SortOrder, a2.SortOrder
Hmm...Jah, hvis jeg gør det i databasen (i koden vil det være møj besværligt), så kommer a2 navnene godt nok sammen med de rette hovedmenupunkter, men ikke som selvstændige rækker som de skal være.
Tja, hvis jeg gør således: SELECT DISTINCT a1.MenuID, a1.MenuName, a2.MenuName as MenuNameC, a1.MenuLink, a2.MenuLink as MenuLinkC, a1.MenuVisible, a1.MID, a1.SortOrder, b.FieldName, b.DefaultText, b.EnglishText FROM PoC_Menu a1 LEFT JOIN PoC_Menu a2 on a1.menuid = a2.parent, PoC_LanguageTexts AS b WHERE a1.MenuName = b.DefaultText AND (b.FieldName LIKE "Menu%") AND a1.Parent = 0 ORDER BY a1.SortOrder, a2.SortOrder
Får jeg i hvert fald de nødvendige data ud. Ikke så kønt som jeg havde håbet på, men det virker. :)
FROM PoC_Menu a1 LEFT JOIN PoC_Menu a2 on a1.menuid = a2.parent, PoC_LanguageTexts AS b WHERE a1.MenuName = b.DefaultText
->
FROM PoC_Menu a1 LEFT JOIN PoC_Menu a2 on a1.menuid = a2.parent, JOIN PoC_LanguageTexts AS b1 ON a1.MenuName = b1.DefaultText JOIN PoC_LanguageTexts AS b2 ON a2.MenuName = b2.DefaultText
saa du har baade en b1 og en b2 som svarer til a1 og a2.
Jeg tror at det er tid til at tage et skrift tilbage.
1) Proev:
SELECT a1.*,b1.*,a2.*,b2.* FROM PoC_Menu a1 LEFT JOIN PoC_Menu a2 on a1.menuid = a2.parent, JOIN PoC_LanguageTexts AS b1 ON a1.MenuName = b1.DefaultText JOIN PoC_LanguageTexts AS b2 ON a2.MenuName = b2.DefaultText
og se hvad du faar.
2) Put WHERE betingelser paa indtil du faar de rigtige raekker
Laver jeg dette: SELECT menuname AS a2name, MenuLink, sortorder AS a1order,-1 AS a2order FROM PoC_Menu WHERE parent = 0 UNION SELECT a2.menuname AS a2name, a2.MenuLink, a1.sortorder AS a1order,a2.sortorder AS a2order FROM PoC_Menu a1 JOIN PoC_Menu a2 ON a1.menuid = a2.parent ORDER BY a1order, a2order;
Ser det foreløbige faktisk ret ok ud...prøver lige og se hvad jeg kan gøre med b...
Nå, det kan jeg åbenbart ikke gennemskue hvordan det gøre.
Dette: SELECT menuname AS a2name, MenuLink, sortorder AS a1order,-1 AS a2order, b1.DefaultText, b2.DefaultText FROM PoC_Menu, PoC_LanguageTexts WHERE parent = 0 UNION SELECT a2.menuname AS a2name, a2.MenuLink, a1.sortorder AS a1order,a2.sortorder AS a2order, b1.DefaultText, b2.DefaultText FROM PoC_Menu a1 JOIN PoC_Menu a2 ON a1.menuid = a2.parent JOIN PoC_LanguageTexts AS b1 ON a1.MenuName = b1.DefaultText JOIN PoC_LanguageTexts AS b2 ON a2.MenuName = b2.DefaultText ORDER BY a1order, a2order;
Giver: Unknown column 'b1.DefaultText' in 'field list'
Du skal ogsaa joine PoC_LanguageTexts ind i foerste del.
Noget a la:
SELECT menuname AS a2name, MenuLink, sortorder AS a1order,-1 AS a2order, DefaultText, '-' FROM PoC_Menu JOIN PoC_LanguageTexts ON PoC_Menu.MenuName = PoC_LanguageTexts.DefaultText WHERE parent = 0 UNION ...
SELECT MenuID, MenuLink, MenuVisible, MID, sortorder AS SortOrder ,-1 AS ChildOrder, FieldName, DefaultText, EnglishText FROM PoC_Menu JOIN PoC_LanguageTexts ON PoC_Menu.MenuName = PoC_LanguageTexts.DefaultText WHERE parent = 0 AND FieldName LIKE "Menu%" UNION SELECT a2.MenuID, a2.MenuLink, a2.MenuVisible, a2.MID, a1.sortorder AS SortOrder ,a2.sortorder AS ChildOrder, b2.FieldName, b2.DefaultText, b2.EnglishText FROM PoC_Menu a1 JOIN PoC_Menu a2 ON a1.menuid = a2.parent JOIN PoC_LanguageTexts AS b1 ON a1.MenuName = b1.DefaultText JOIN PoC_LanguageTexts AS b2 ON a2.MenuName = b2.DefaultText ORDER BY SortOrder, ChildOrder;
Synes godt om
Ny brugerNybegynder
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.