php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 31.01.2012, 10:45  
Erfahrener Benutzer
 
Benutzerbild von pfump
 
Registriert seit: 29.03.2008
Beiträge: 576
pfump kann nur auf Besserung hoffen
Standard Gleicher Kategoriename in mehreren Ebenen - Falsche DB Struktur

Hallo,

ich habe folgende Tabellen:

Ich möchte einen Tree darstellen. Was ich auch mache
Folgender Maßen sieht er aus:

Microsoft Office
.....|______Excel
.....|______Word
Windows XP
.....|______Explorer
..................|______Dateien
..................|______Desktop
.....|______Registry
.....|______System
..................|______Boot
..................|______Netzwerk
Windows 7
.....|______Explorer
..................|______Dateien
..................|______Desktop
.....|______Registry
.....|______System
..................|______Boot
..................|______Netzwerk

Meine Tabellen sehen so aus:
Tabelle cat_name Tabelle cats
------------------------------- -------------------------------------------
| id | name | | id | cat_id | parent_id |
------------------------------- -------------------------------------------
| 1 |Microsoft Office | | 1 | 1 | 0 |
-------------------------------
-------------------------------------------
------------------------------- -------------------------------------------
| 2 | Windows XP | | 2 | 2 | 0 |
------------------------------- -------------------------------------------
------------------------------- -------------------------------------------
| 3 | Windows 7 | | 3 | 3 | 0 |
------------------------------- -------------------------------------------
------------------------------- -------------------------------------------
| 4 | Explorer | | 4 | 4 | 2 |
------------------------------- -------------------------------------------
------------------------------- -------------------------------------------
| 5 | System | | 5 | 4 | 3 |
------------------------------- -------------------------------------------
------------------------------- -------------------------------------------
| 6 | Dateien | | 6 | 6 | 4 |
------------------------------- -------------------------------------------
------------------------------- -------------------------------------------
| 7 | Registry | | 7 | 7 | 2 |
------------------------------- -------------------------------------------

und so weiter...

Die Daten lese ich rekursiv aus der DB aus.

Wie ihr bestimmt bereits bemerkt habt, ergibt sich aus dieser Struktur
ein Problem. Nämlich das eine Kategorie nur einmal vorhanden sein darf.

Wie kann ich es umsetzen das ich in mehreren (unterschiedlichen) Zweigen
gleichnamige Kategorien haben kann?

Ich hoffe ich hab mich einigermaßen verständlich ausgedrückt.



Geändert von pfump (31.01.2012 um 10:49 Uhr).
pfump ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 31.01.2012, 10:48  
Erfahrener Benutzer
 
Benutzerbild von wolf29
 
Registriert seit: 17.03.2010
Beiträge: 1.833
PHP-Kenntnisse:
Fortgeschritten
wolf29 wird schon bald berühmt werdenwolf29 wird schon bald berühmt werden
Standard

Hi,

Zitat:
Wie ihr bestimmt bereits bemerkt habt, ergibt sich aus dieser Struktur
ein Problem. Nämlich das eine Kategorie nur einmal vorhanden sein darf.
...sehe ich nicht

Wie sieht dein Quellcode aus?

mfg wolf29
__________________
while (!asleep()) sheep++;

Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.
wolf29 ist offline   Mit Zitat antworten
Alt 31.01.2012, 10:51  
Erfahrener Benutzer
 
Benutzerbild von pfump
 
Registriert seit: 29.03.2008
Beiträge: 576
pfump kann nur auf Besserung hoffen
Standard

Hier mal die Funktion zum Auslesen der Kategorien:

PHP-Code:
function auslesen($id=0,$zweig=-1){
         
$seite="";
         if(isset(
$_GET["site"])) $seite=$_GET["site"];
                 
$sql "SELECT cats.cat_id, cats.parent_id, cats_name.cat_id, cats_name.name, cats_name.link FROM (cats
                             LEFT JOIN cats_name ON cats_name.cat_id = cats.cat_id)  WHERE cats.parent_id= {$id} ORDER BY cats_name.name"
;
         
$erg mysql_query($sql,connectDB()) or die(mysql_error());   
         if(
$zweig!=-1) echo "<ul>";         
         

         while (
$tree mysql_fetch_object($erg)){
               
$tree->cat_id==$seite ? print("<li><a class='aktiv' href='{$_SERVER["PHP_SELF"]}?site=".$tree->cat_id."'>{$tree->name}</a>\n") : print("<li><a href='{$_SERVER["PHP_SELF"]}?site=".$tree->cat_id."'>{$tree->name}</a>\n");
               if(
$zweig==0) echo "</li>\n";
               
$sql="SELECT cats.cat_id, cats.parent_id, cats_name.cat_id, cats_name.name, cats_name.link FROM (cats
                             LEFT JOIN cats_name ON cats_name.cat_id = cats.cat_id)  WHERE cats.parent_id= {$tree->cat_id} ORDER BY cats_name.name"
;
               
$erg2=mysql_query($sql,connectDB());
               if(
mysql_num_rows($erg2)>0auslesen($tree->cat_id,mysql_num_rows($erg2)) ;
               echo 
"</li>\n";
         } 
//while-Schleife
         
if($zweig!=-1) echo "</ul>";
       } 
//Funktion zum Auslesen der Daten 
pfump ist offline   Mit Zitat antworten
Alt 31.01.2012, 15:30  
Erfahrener Benutzer
 
Registriert seit: 13.01.2012
Beiträge: 256
PHP-Kenntnisse:
Anfänger
akretschmer befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von pfump Beitrag anzeigen
Hallo,

ich habe folgende Tabellen:

Ich möchte einen Tree darstellen. Was ich auch mache
Folgender Maßen sieht er aus:

Microsoft Office
.....|______Excel
.....|______Word
Windows XP
.....|______Explorer
..................|______Dateien
..................|______Desktop
.....|______Registry
.....|______System
..................|______Boot
..................|______Netzwerk
Windows 7
.....|______Explorer
..................|______Dateien
..................|______Desktop
.....|______Registry
.....|______System
..................|______Boot
..................|______Netzwerk

Meine Tabellen sehen so aus:
Tabelle cat_name Tabelle cats
------------------------------- -------------------------------------------
| id | name | | id | cat_id | parent_id |
------------------------------- -------------------------------------------
| 1 |Microsoft Office | | 1 | 1 | 0 |
-------------------------------
-------------------------------------------
------------------------------- -------------------------------------------
| 2 | Windows XP | | 2 | 2 | 0 |
------------------------------- -------------------------------------------
------------------------------- -------------------------------------------
| 3 | Windows 7 | | 3 | 3 | 0 |
------------------------------- -------------------------------------------
------------------------------- -------------------------------------------
| 4 | Explorer | | 4 | 4 | 2 |
------------------------------- -------------------------------------------
------------------------------- -------------------------------------------
| 5 | System | | 5 | 4 | 3 |
------------------------------- -------------------------------------------
------------------------------- -------------------------------------------
| 6 | Dateien | | 6 | 6 | 4 |
------------------------------- -------------------------------------------
------------------------------- -------------------------------------------
| 7 | Registry | | 7 | 7 | 2 |
------------------------------- -------------------------------------------

und so weiter...

Die Daten lese ich rekursiv aus der DB aus.

Wie ihr bestimmt bereits bemerkt habt, ergibt sich aus dieser Struktur
ein Problem. Nämlich das eine Kategorie nur einmal vorhanden sein darf.

Wie kann ich es umsetzen das ich in mehreren (unterschiedlichen) Zweigen
gleichnamige Kategorien haben kann?

Ich hoffe ich hab mich einigermaßen verständlich ausgedrückt.



Ich seh Dein problem nicht:

Code:
test=*# select * from pfump ;
 id | parent |   value
----+--------+-----------
  1 |        | MS Office
  2 |      1 | Excel
  3 |      1 | Word
  4 |        | Win XP
  5 |      4 | Explorer
  6 |      5 | Dateien
  7 |      5 | Desktop
  8 |      4 | Registry
  9 |      4 | System
 10 |      9 | Boot
 11 |      9 | Netzwerk
 12 |        | Win 7
 13 |     12 | Explorer
 14 |     13 | Dateien
 15 |     13 | Desktop
 16 |     12 | Registry
 17 |     12 | System
(17 rows)

test=*# with recursive r as (select id, parent, value, 0 as count from pfump where parent is null union all select p.id, p.parent, p.value, r.count+1 from pfump p, r where r.id=p.parent) select repeat('-',count)||'>',value from r order by id;
 ?column? |   value
----------+-----------
 >        | MS Office
 ->       | Excel
 ->       | Word
 >        | Win XP
 ->       | Explorer
 -->      | Dateien
 -->      | Desktop
 ->       | Registry
 ->       | System
 -->      | Boot
 -->      | Netzwerk
 >        | Win 7
 ->       | Explorer
 -->      | Dateien
 -->      | Desktop
 ->       | Registry
 ->       | System
(17 rows)
Das purzelt also schon fast wie Deine Grafik aus der Datenbank ... kann man auch noch schöner machen.

Andreas
akretschmer ist offline   Mit Zitat antworten
Alt 31.01.2012, 19:02  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Whaaa rekursives mysql_query - Schlimmer gehts nimmer.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 31.01.2012, 19:20  
Erfahrener Benutzer
 
Registriert seit: 13.01.2012
Beiträge: 256
PHP-Kenntnisse:
Anfänger
akretschmer befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Whaaa rekursives mysql_query - Schlimmer gehts nimmer.
Rekursive Abfragen können schon nützlich sein ...

Andreas
akretschmer ist offline   Mit Zitat antworten
Alt 31.01.2012, 19:21  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
rekursives mysql_query
Btw:
Zitat:
test=*# with recursive r as (select id, parent, value, 0 as count from pfump where parent is null union all select p.id, p.parent, p.value, r.count+1 from pfump p, r where r.id=p.parent) select repeat('-',count)||'>',value from r order by id;
übersichtlich ist auch was anderes
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 31.01.2012, 19:31  
Erfahrener Benutzer
 
Registriert seit: 13.01.2012
Beiträge: 256
PHP-Kenntnisse:
Anfänger
akretschmer befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Btw:
übersichtlich ist auch was anderes
Nun ja, ich weiß, ...

Code:
with
  recursive r
as (
  select
    id,
    parent,
    value,
    0 as count
  from
    pfump
  where
    parent is null
  union all
  select
    p.id,
    p.parent,
    p.value,
    r.count+1
  from
    pfump p,
    r
  where
    r.id=p.parent
)
select
  repeat('-',count)||'>',
  value
from
  r
order by
  id;
Besser?

Andreas
akretschmer ist offline   Mit Zitat antworten
Alt 31.01.2012, 19:35  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 01.02.2012, 09:14  
Erfahrener Benutzer
 
Benutzerbild von pfump
 
Registriert seit: 29.03.2008
Beiträge: 576
pfump kann nur auf Besserung hoffen
Standard

Zitat:
@akretschmer:


Die Tabellenstruktur wie du sie aufgezeigt hast hattte ich am Anfang.
Jedoch habe ich jetzt 2 Tabellen. Ich habe also die Namen ausgelagert.
Sinn war eigentlich das halt nicht 2x Explorer, 2xDateien etc. in meiner Tabelle steht.

Wenn ich diese noch einmal hinzufüge ist das ja kein Problem, das wollte ich allerdings nicht.

pfump ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
with recursive

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:52 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum