php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #16 (permalink)  
Alt 11-11-2003, 10:30
Spea
 Guest
Spea
Beiträge: n/a
Standard

hi,

ich bin bei der Suche auf diesen Thread gestossen, und da ich gerade eine ähnliche Baumstruktur benötige, wollte ich fragen ob jemand so freundlich wäre und die Tabellen Struktur posten könnte.

Wäre echt nett...

mfg

Spea
Mit Zitat antworten
  #17 (permalink)  
Alt 11-11-2003, 10:39
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard Re: wie macht mans am besten?

Zitat:
Original geschrieben von TBT
derzeitige Tabellen:

menu
========
menu_id ( Menupunkt )
parent_id ( übergeordneter Menupunkt, oder 0 wenn ganz oben )
level ( Baumtiefe )
sort ( Sortierung bei nebeneinander liegenden Menupunkten )

menu_menu
=========
menu_id ( Menupunkt )
child_id ( alle untergeordneten Menupunkte )
diese?
__________________
Ich denke, also bin ich. - Einige sind trotzdem...
Mit Zitat antworten
  #18 (permalink)  
Alt 11-11-2003, 10:45
Spea
 Guest
Spea
Beiträge: n/a
Standard

fehlt da nicht noch was?
oder sehe ich das falsche?

|
|
|
\/
PHP-Code:
$result $query->select('SELECT m2.menu_id, m2.level, m2.sort, m2.parent_id, 
                        if(isnull(mu.user_right),0,mu.user_right) + 
                        sum(mu2.user_right) my_user_right, d.text
                    FROM  menus m 
                    LEFT JOIN menus_has_menus mm 
                        ON  ( m.menu_id = mm.child_id ) 
                    LEFT JOIN menus m2 
                        ON ( mm.menu_id = m2.parent_id )
                    LEFT JOIN menus_has_user mu
                        ON ( m2.menu_id = mu.menu_id AND mu.user_id = 1)
                    LEFT JOIN menus_has_menus mm2
                        ON ( m2.menu_id = mm2.child_id )
                    LEFT JOIN menus_has_user mu2
                        ON ( mm2.menu_id = mu2.menu_id AND mu2.user_id = 1)
                    LEFT JOIN datas d 
                        ON ( m2.data_id = d.data_id ) 
                    WHERE m.menu_id = '
.$site.' or m.parent_id = '.$site.
                    GROUP BY m2.menu_id, m2.parent_id, m2.level, m2.sort 
                    ORDER BY m2.parent_id, m2.level, m2.sort'
); 
Mit Zitat antworten
  #19 (permalink)  
Alt 11-11-2003, 10:47
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard

was hat das mit der tabellenstruktur zu tun?
__________________
Ich denke, also bin ich. - Einige sind trotzdem...
Mit Zitat antworten
  #20 (permalink)  
Alt 11-11-2003, 10:47
Abraxax
  THE REAL HAXE (Administrator)
Links : Onlinestatus : Abraxax ist offline
Registriert seit: Jul 2002
Ort: neuss.nrw.de
Beiträge: 22.623
Abraxax befindet sich auf einem aufstrebenden Ast
Standard

die beiden tabellen menus_has_user und datas sind für seine benutzerverwaltung und haben ncihts mit dem menü zu tun.

die kannst du auch aus der query entfernen.
__________________
INFO: Erst suchen, dann posten! | MANUAL(s): PHP | MySQL | HTML/JS/CSS | NICE: GNOME Do | TESTS: Gästebuch | IM: Jabber.org |


Mit Zitat antworten
  #21 (permalink)  
Alt 11-11-2003, 10:50
Spea
 Guest
Spea
Beiträge: n/a
Standard

ok, mal sehen ob ich es hinbekomme

danke nochmals
Mit Zitat antworten
  #22 (permalink)  
Alt 20-01-2005, 14:53
Payne_of_Death
 Master
Links : Onlinestatus : Payne_of_Death ist offline
Registriert seit: Dec 2002
Ort: Folterkeller Nr. 18
Beiträge: 2.953
Payne_of_Death ist zur Zeit noch ein unbeschriebenes Blatt
Payne_of_Death eine Nachricht über ICQ schicken Payne_of_Death eine Nachricht über AIM schicken Payne_of_Death eine Nachricht über Yahoo! schicken
Standard

Könnte mir mal Jemand sagen wie die menus_has_users aussehen müsste um den ersten Knoten anzuzeigen ?

Wenn die Table leer ist => komplette NULL Zeile...
Wenn die menu_id gesetzt ist und das user_rights Spalte 0,-1,1,2,3,4 ist selbiges......

Mit anderen Worten bis auf die Nested Sets Modell Table menu in Verbindung mit der menus_has_menus Table erhalte ich die geforderte Ausgabe......

Für ein exemplarisches Durchspielen mit menu_has_user wäre ich sehr dankbar....

bin nämlich im moment etwas verwirrt
__________________
MfG Payne_of_Death

Manual(s): <-| PHP | MySQL | SELFHTML |->
Merke:
Du brauchst das Rad nicht neu erfinden ! <-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

Murphy`s Importanst LAWS
Jede Lösung bringt nur neue Probleme
Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
In jedem kleinen Problem steckt ein großes, das gern raus moechte.
Mit Zitat antworten
  #23 (permalink)  
Alt 02-02-2006, 21:02
Xdevel
 Newbie
Links : Onlinestatus : Xdevel ist offline
Registriert seit: Jan 2006
Beiträge: 34
Xdevel ist zur Zeit noch ein unbeschriebenes Blatt
Standard Re: wie macht mans am besten?

Zitat:
Original geschrieben von TBT


derzeitige Tabellen:

menu
========
menu_id ( Menupunkt )
parent_id ( übergeordneter Menupunkt, oder 0 wenn ganz oben )
level ( Baumtiefe )
sort ( Sortierung bei nebeneinander liegenden Menupunkten )

menu_menu
=========
menu_id ( Menupunkt )
child_id ( alle untergeordneten Menupunkte )
wäre es nicht besser so:

menu
--------------
menu_id
parent_id (menu_id als FK)
sort


Und das ganze dann rekursiv lesen. Parent_id ist null wenn es die
allererste generation ist. Ansonsten über den parent_id findest du
schon raus welches level es ist. Das braucht man nicht mehr extra
speichern.

Zur Rekursion gibt es hier was:
http://www.phun-x.com/index.php?pid=9&lang=de

Was die Rechte angeht, habe ich mal gelesen, dass dafür die beste
Lösung eine Bitweise Berechnung ist. Denn es spart dann ständiege
Erweiterungen bei der Datenbank. Wie es aber im einzeln
funktioniert kann ich leider nicht sagen. Vielleicht findet man was
beim Google.
__________________
Xdevel
Mit Zitat antworten
  #24 (permalink)  
Alt 02-02-2006, 21:45
TBT
  Moderator
Links : Onlinestatus : TBT ist offline
Registriert seit: Sep 2002
Ort: Berlin
Beiträge: 2.787
TBT befindet sich auf einem aufstrebenden Ast
TBT eine Nachricht über ICQ schicken TBT eine Nachricht über AIM schicken TBT eine Nachricht über Yahoo! schicken
Standard

natürlich, Rekursion das Zauberwort!

Rekursion ist schön und gut, doch sollte man genau abschätzen wann es was bringt
und wann nicht. Was passiert wohl bei 20 Ebenen? 20 Anfragen an die Datenbank? Das ist ja wohl nicht sind der Sache.
Bei der von mir beschriebenen, und inzwischen als Klasse implementierte Methode
kannst man bei jeder beliebigen Baumtiefe alle Daten mit nur einer SQL Anweisung ermitteln.
Das Verschieben der Knoten ist einfacher als beim Nested Set, und beim Einfügen braucht man auch keinerlei Update Anweisungen.
Probiere es einfach aus, oder lass es sein.
__________________
TBT

Die zwei wichtigsten Regeln für eine berufliche Karriere:
1. Verrate niemals alles was du weißt!


PHP 2 AllPatrizier II Browsergame
Mit Zitat antworten
  #25 (permalink)  
Alt 02-02-2006, 22:45
Xdevel
 Newbie
Links : Onlinestatus : Xdevel ist offline
Registriert seit: Jan 2006
Beiträge: 34
Xdevel ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von TBT
natürlich, Rekursion das Zauberwort!

Rekursion ist schön und gut, doch sollte man genau abschätzen wann es was bringt
und wann nicht. Was passiert wohl bei 20 Ebenen? 20 Anfragen an die Datenbank? Das ist ja wohl nicht sind der Sache.
Bei der von mir beschriebenen, und inzwischen als Klasse implementierte Methode
kannst man bei jeder beliebigen Baumtiefe alle Daten mit nur einer SQL Anweisung ermitteln.
Das Verschieben der Knoten ist einfacher als beim Nested Set, und beim Einfügen braucht man auch keinerlei Update Anweisungen.
Probiere es einfach aus, oder lass es sein.
Klar, mit Sicherheit. Ales ist die Frage des Stills, einer macht so und der andere so.

Aber was die Übersichtlichkeit betrifft, ist die Rekursion besser.
Was die Performance angeht - komm wenn die Sache richtig programmiert ist gibt es keine Probleme. Ich hatte bei einem Projekt über 10 Tausen Einträge mit bis zum Level 10 und es dauerte vielleicht mal 2 Sekunden bis der Baum im Browser angezeigt wurde.
__________________
Xdevel
Mit Zitat antworten
  #26 (permalink)  
Alt 01-10-2006, 21:06
Benny-one
 Master
Links : Onlinestatus : Benny-one ist offline
Registriert seit: Jan 2002
Ort: Fulda
Beiträge: 5.700
Benny-one ist zur Zeit noch ein unbeschriebenes Blatt
Benny-one eine Nachricht über ICQ schicken
Standard

Stehe vor dem gleichen Problem (denke ich).

Wenn ich TBT richtig verstanden habe, brauchte er die komplette Baumstruktur.
Ich brauch jedoch immer nur den übergeordneten Ordner.
Derzeit setze ich bei einer Tiefe von 14 Ebenen insgesamt 45 Queries ab in 0,88ms wobei 26 Queries für die Prüfung der Rechte und das auslesen des übergeordneten Ordners draufgehen, nicht sehr toll also.

Meine Tabellenstruktur ist so:
content
c_id (Menpunkt)
c_parentid (übergeordneter Menüpunkt, bei 0 oberste Ebene)
....

modules
module (Name des Modules)
module_table_name (Tabellenname, in dem Falle "content")
module_primary_key (Primärschlüssel, in dem Falle "c_id")
module_secondary_key (Sekundärschlüssel, in dem Falle "c_parentid")
module_title_column (in dem Fall "titel", nicht weiter wichtig)
no_table (auch nicht weiter wichtig)
recursive_permission_check (sagt aus, dass die Rechteverwaltung Rekursiv prüfen soll)
administrator (1=Gruppe muss vom Typ Administrator sein)
backend (1=Gruppe muss vom Typ Backend sein)
frontend (1=Gruppe muss vom Typ Frontend sein)

permissions
module (Name des Modules)
administrator
backend
frontend
id (in dem Falle die ID der Spalte "c_id" aus "content")
group_id
read
edit
create
delete

Meine Prüfung
PHP-Code:
$result_module_preferences $this->_db->query("SELECT `module_table_name`, 
                                    `module_primary_key`, 
                                    `module_secondary_key`, 
                                    `recursive_permission_check`
                                    FROM {prefix}modules WHERE `module`='"
.$this->_db->escape($module)."'");
$row_module_preferences $this->_db->fetch_assoc($result_module_preferences);

if (
$row_module_preferences['recursive_permission_check'] == 1) {
    
$finish false;
    while (
$finish != true) {
        
$result_parentid $this->_db->query("SELECT 
            `"
.$this->_db->escape($row_module_preferences['module_secondary_key'])."`
            FROM {prefix}"
.$this->_db->escape($row_module_preferences['module_table_name'])."
            WHERE 
            `"
.$this->_db->escape($row_module_preferences['module_primary_key'])."`='".$this->_db->escape($id)."'");
        
$row_parentid $this->_db->fetch_assoc($result_parentid);
    
        
$result_permission $this->_db->query("SELECT `".$this->_db->escape($access_type)."`, 
                                                `administrator`, 
                                                `backend`, 
                                                `frontend` 
                                                FROM {prefix}permissions
                                                   WHERE module='"
.$this->_db->escape($module)."'
                                                AND id='"
.$this->_db->escape($id)."'
                                                AND group_id='"
.$this->_db->escape($group_id)."'");
        
$row_permission $this->_db->fetch_assoc($result_permission);
    
        if (
$row_permission[$access_type]) {
            
$id $row_parentid[$row_module_preferences['module_secondary_key']];
            if (
$row_parentid[$row_module_preferences['module_secondary_key']] == 0) {
                
$finish true;
            }
        } else {
            
$finish true;
        }
    }

Wie muss ich das nun umformen, oder geht das mit dieser Struktur überhaupt nicht?
Mit Zitat antworten
  #27 (permalink)  
Alt 01-10-2006, 21:37
TBT
  Moderator
Links : Onlinestatus : TBT ist offline
Registriert seit: Sep 2002
Ort: Berlin
Beiträge: 2.787
TBT befindet sich auf einem aufstrebenden Ast
TBT eine Nachricht über ICQ schicken TBT eine Nachricht über AIM schicken TBT eine Nachricht über Yahoo! schicken
Standard

du willst also diese Brotkrümel haben?
Das ist mit 1 SQL Anweisung zu erschlagen

SELECT c.name_c
FROM menu_menu b
INNER JOIN menu c
ON ( b.parent_i = c.menuid_i )
WHERE b.child_i = \''.$_point.'\'
GROUP BY c.name_c
ORDER BY c.level_i ASC
__________________
TBT

Die zwei wichtigsten Regeln für eine berufliche Karriere:
1. Verrate niemals alles was du weißt!


PHP 2 AllPatrizier II Browsergame
Mit Zitat antworten
  #28 (permalink)  
Alt 01-10-2006, 21:40
Benny-one
 Master
Links : Onlinestatus : Benny-one ist offline
Registriert seit: Jan 2002
Ort: Fulda
Beiträge: 5.700
Benny-one ist zur Zeit noch ein unbeschriebenes Blatt
Benny-one eine Nachricht über ICQ schicken
Standard

Zitat:
Original geschrieben von TBT
du willst also diese Brotkrümel haben?
auch, aber es geht mir insbesondere um die Abfrage der Rechte aus der Tabelle permission.

Und ich habe nicht wie du eine Tabelle menu und menu_menu sondern NUR die Tabelle content. Deswegen auch die Frage: geht das überhaupt mit der Struktur?
Mit Zitat antworten
  #29 (permalink)  
Alt 02-10-2006, 23:39
sternm
 Banned
Links : Onlinestatus : sternm ist offline
Registriert seit: Sep 2006
Beiträge: 103
sternm ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von TBT
Bei der von mir beschriebenen, und inzwischen als Klasse implementierte Methode
kannst man bei jeder beliebigen Baumtiefe alle Daten mit nur einer SQL Anweisung ermitteln.
Frage, braucht es bei zB 20 Ebenen ein 20faches join, oder geht deine Methode immer mit
den beschriebenen etwa 2 joins? Ich blicke noch nicht soweit durch.
Danke trotzdem.
Mit Zitat antworten
  #30 (permalink)  
Alt 02-10-2006, 23:55
TBT
  Moderator
Links : Onlinestatus : TBT ist offline
Registriert seit: Sep 2002
Ort: Berlin
Beiträge: 2.787
TBT befindet sich auf einem aufstrebenden Ast
TBT eine Nachricht über ICQ schicken TBT eine Nachricht über AIM schicken TBT eine Nachricht über Yahoo! schicken
Standard

du brauchst immer nur eine SQL mit 2 Joins dafür
__________________
TBT

Die zwei wichtigsten Regeln für eine berufliche Karriere:
1. Verrate niemals alles was du weißt!


PHP 2 AllPatrizier II Browsergame
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 03:11 Uhr.