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
  #1 (permalink)  
Alt 25-08-2005, 14:42
plastikbaum
 Registrierter Benutzer
Links : Onlinestatus : plastikbaum ist offline
Registriert seit: Aug 2005
Beiträge: 66
plastikbaum ist zur Zeit noch ein unbeschriebenes Blatt
Standard Nested set mit zugeordneten Datensätzen kombinieren

Hallo,

ich habe wieder ein Problem, bei dem ich nicht weiterkomme.

Es gibt eine als Nested set ausgelegte Tabelle mit Warengruppen (Unterwarengruppen etc.), eine Tabelle mit Artikeln und eine Zwischentabelle für die Verknüpfung der Artikel mit den Warengruppen.

Ist es nun möglich, mit einer Abfrage die Warengruppen inkl. der dazugehörigen Artikel als ihre "Kinder" auszugeben?

Mein Problem besteht darin, dass bei der Abfrage der Warengruppen ja mit GROUP BY gearbeitet wird. Folglich wird einer jeweiligen Warengruppe nur ein Artikel zugeordnet, nicht alle. Lässt sich das anders lösen?

Mir ist klar, dass ich einmal den Baum der Warengruppen und einmal die Artikelzuordnungen auslesen und anschließend ein gesamtes Array erstellen könnte. Mich interessiert aber, ob es auch nur mit SQL möglich ist. Ich finde leider keinen sinnvollen Ansatz.

Struktur:

tbl_wgruppen: id, lft, rgt, name
tbl_artikel: id, name
tbl_zuordnung: id, artikel_id, wgruppen_id

Angenommen, der Baum sieht so aus:
Code:
hosen
 |- lila
 |- blau
 |- gelb
blumen
 |- rosa
 |- orange
     |- groß
     |- klein
 |- rot
und die Artikel so:

blume1 (gehört blumen-rosa,blumen-orange-klein)
blume2 (gehört blumen-rot,blumen-orange-groß)

Dann müsste das Ergebnis so aussehen:
Code:
hosen
 |- lila
 |- blau
 |- gelb
blumen
 |- rosa
     |- blume1
 |- orange
     |- groß
         |- blume2
     |- klein
         |- blume1
 |- rot
     |- blume2
Dadurch, dass die Abfrage des Baumes nun (grob) so aussieht:
Code:
SELECT wg2.*, COUNT(*) AS lev, ...
  FROM tbl_wgruppen wg1,
       tbl_wgruppen AS wg2
    WHERE wg2.lft BETWEEN wg1.lft AND wg1.rgt
  GROUP BY wg2.lft
ergibt sich eben das Problem, dass beim Einbeziehen der Artikel und Artikelzuordnungen in die Abfrage einer Warengruppe (höchstens) nur ein Artikel zugeordnet wird; eben durch die Gruppierung.

Hat sich schon jemand mal mit so einer Problemstellung befasst und weiß Abhilfe? Wie gesagt, es ist kein wichtiges Problem, sondern reines Interesse.
Mit Zitat antworten
freelancermap.de - IT Projektvermittlung für Selbständige und Freiberufler
  #2 (permalink)  
Alt 27-08-2005, 18:20
Titus
 PHP Master
Links : Onlinestatus : Titus ist offline
Registriert seit: Jan 2001
Ort: im Rodgau
Beiträge: 4.292
Titus ist zur Zeit noch ein unbeschriebenes Blatt
Post

Mit einer einfachen Schleife (einlesen, ausgeben) wird das nix.

Am Join liegt´s nicht, die Bedingung ließe sich ja ändern.
Das Problem ist vielmehr, dass zusätzlich zu den Artikeln einer Warengruppe die Gruppe selbst als Datensatz benötigt wird.

Mit etwas Aufwand in der Schleife ist das aber problemlos möglich:

PHP-Code:
$sql "
select g.id wgruppen_id, g.lft, g.rgt, g.name wgruppen_name,
  a.id artikel_id, a.name artikel_name
from tbl_wgruppen g
  left join tbl_zuordnung z on z.wgruppen_id=g.id
  left join tbl_artikel a on a.id=z.artikel_id
group by g.lft, a.id
order by g.lft, a.id"
;
$res mysql_query($sql)
  or die (
nl2br(htmlentties($sql). "\n"mysql_error()));
$root mysql_fetch_assoc($res);
$lvl2rgt = array(-1=>$root['rgt']);
$level $wgruppen_id $lastrgt 0;
echo 
'<pre>';
while (
$row mysql_fetch_assoc($res))
{
  if (
$wgruppen_id<>$row['wgruppen_id'])
  { 
// Warengruppe hat gewechselt - Datensatz ausgeben
    // Wenn LFT des aktuellen Datensatzes > RGT des parent-level --> nach links
    
if ($row['lft']>$lvl2rgt[$level-1]) $level--;
    
// Wenn LFT < letztes RGT --> nach rechts
    
elseif ($row['lft'] < $lastrgt$level++;
    if (
$level) echo str_repeat('   '$level-1), ' |-';
    echo 
' '$row['wgruppen_name'], ' ( ID='$row['wgruppen_id'], ' )'"\n";
  }
  
// Wenn Artikeldaten --> ausgeben
  // (soll ja in leeren Warengruppen kein "leerer" Artikel ausgeworfen werden!)
  
if ($row['artikel_id'])
  {
    echo 
str_repeat('   '$level), ' |-';
    echo 
' '$row['artikel_name'], ' ( ID='$row['artikel_id'], ' )'"\n";
  }
  
$lastrgt $lvl2rgt[$level] = $row['rgt'];
}
echo 
'</pre>'
__________________
mein Sport: mein Frühstück: meine Arbeit:

Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.
Mit Zitat antworten
  #3 (permalink)  
Alt 30-08-2005, 10:10
plastikbaum
 Registrierter Benutzer
Links : Onlinestatus : plastikbaum ist offline
Registriert seit: Aug 2005
Beiträge: 66
plastikbaum ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Vielen Dank für die Mühe

Bis auf die fehlende Festlegung der zuletzt ausgegebenen WGruppen_ID funktioniert das so fehlerfrei. Zumindest konnte ich bisher mit ein paar Testeinträgen keine Fehler finden.

Falls jemand diese Funktion benutzen sollte:

nach

$lastrgt = $lvl2rgt[$level] = $row['rgt'];

noch

$wgruppen_id=$row['wgruppen_id'];

hinzufügen.

Kannst du mir vielleicht noch erklären, wieso nach der Artikel_ID gruppiert wird? Ich habe es auch ohne dieser Gruppierung versucht, und es werden einige Einträge nicht angezeigt. Ich kann aber logisch nicht nachvollziehen, woran das liegt.

Nochmals herzlichen Dank.
Mit Zitat antworten
  #4 (permalink)  
Alt 31-08-2005, 09:35
Titus
 PHP Master
Links : Onlinestatus : Titus ist offline
Registriert seit: Jan 2001
Ort: im Rodgau
Beiträge: 4.292
Titus ist zur Zeit noch ein unbeschriebenes Blatt
Smile

Zitat:
Original geschrieben von plastikbaum
Vielen Dank für die Mühe
hab das nur eben in 5 minuten zusammengehäckselt. Ich wunder mich nur gerad, dass es keinen parse error gibt
Zitat:
Kannst du mir vielleicht noch erklären, wieso nach der Artikel_ID gruppiert wird?
Jetzt wo Du´s sagst ... Die "group by"-Klausel ist in diesem Fall tatsächlich überflüssig; nur wenn noch irgendein count auf eine andere Tabelle dazu käme, wäre sie nötig.
Aber wenn group by, dann beide Felder! Sonst bekommst Du nur einen Artikel pro Warengruppe angezeigt.
Zitat:
Ich habe es auch ohne dieser Gruppierung versucht, und es werden einige Einträge nicht angezeigt. Ich kann aber logisch nicht nachvollziehen, woran das liegt.
Viel Erfolg bei der Suche. Eine Möglichkeit das heraus zu finden ist, die nicht angezeigten Datensätze umzubauen, bis sie angezeigt werden ... immer ein Feld nach dem anderen.

Vielleicht fehlt aber einfach nur die Zuordnung?
select a.*, z.artikel_id from tbl_artikel a left join tbl_zuordnung z on z.artikel_id=a.id having z.artikel_id is null
__________________
mein Sport: mein Frühstück: meine Arbeit:

Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.
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

PHP Marktplatz-Software
PHP Marktplatz-SoftwareEs hat sich viel getan! Die neue Version 7.5.9 unserer PHP Marktplatz-Software ebiz-trader steht ab sofort zur Verfügung.

28.10.2019 | Berni

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni


 

Aktuelle PHP Scripte

SMT

Server Monitoring & Management Tool Das SMT wurde von einem Administrator für Administratoren entwickelt, es vereinfacht den Alltag in der klassischen Administration und Verwaltung. Mit dem SMT kannst Du alle Deine Server & Dienste verwalten und überwach

04.09.2020 palle_1977 | Kategorie: PHP
numaeks Web-Farbmixer

Die RGB-Farben lassen sich hier auf unterschiedliche Weise mischen. Zur Einstellung werden auch die Dreh- und Schieberegler mit Canvas verwendet. Gespeichert werden die Farben in einem Cookie.

04.09.2020 numaek | Kategorie: JAVASCRIPT/ Tools
phplinX-Erotikportal 4 ansehen phplinX-Erotikportal 4

Erweiterbares Portal speziell für Erotik mit den Modulen Webkatalog, Bannermanagement und Kleinanzeigenmarkt. Sämtliche Module können über einen einzigen Adminbereich verwaltet werden.

18.06.2020 Cosinus14 | Kategorie: PHP/ Anzeigenmarkt
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:33 Uhr.