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 04-09-2007, 19:44
kendor
 Newbie
Links : Onlinestatus : kendor ist offline
Registriert seit: Sep 2007
Beiträge: 11
kendor ist zur Zeit noch ein unbeschriebenes Blatt
Question MySQL Abfrage - Rekursiv&Joins - ihr wissts bestimmt?!

Hallo Leute!
Nun, ich habe ein kleines Problem mit einer meiner MySQL abfragen. und
ich wär echt froh wenn irgend ein profi von euch mir da weiter helfen kann!!

Grundlegendes zur datenbank:
ich habe 3 Tabellen mit entsprechenden zeilen (-) wie folgt:
1. events (beihnaltet eine liste von events)
- id_events
- Start
- Stop
- Titel
2. kategorie (beinhaltet verschiedene usergruppen)
- id_cat
- subofcat
- titel
3. daten (beinhaltet dann schlussendlich alle daten und verlinkt die beiden)
- ID
- id_cat
- id_events

als beispiel also:
zeilen in events:
Code:
1 - start1 - stop1- faulenzen
2 - start2 - stop2 - ausflug
3 - start3 - stop3 - schlafen
zeilen in kategorie:
Code:
1 - NULL - Familienmitglied
2 - NULL - Besucher
3 - 1 - Hausmann
4 - NULL - Irgendwer
5 - 2 - Freund 
   (heisst so viel wie der Hausmann ist auch ein Familienmitglied, 
   der Freund ist ein Besucher - zeile subofcat sagt welches die
   oberkategorie ist)
6 - 3 - Markus 
   (Markus ist ein Freund und ein Besucher! - fortgeschritten dann)
zeilen in data:
Code:
1 - 1 - 3 (von start1 bis stop1 gilt faulenzen [1] für den hausmann [3])
2 - 1 - 4 (von start1 bis stop1 gilt faulenzen [1] für irgendwer [3])
3 - 3 - 1 (von start3 bis stop3 gilt schlafen [3] für alle familienmitglieder [1]
               - also ach für den hausmann)
4 - 2 - 5 (von start2 bis stop2 gilt ausflug [2] für den freund [5]
soweit so gut

mit der abfrage:
PHP-Code:
SELECT  
  events
.titel
  
kategorie.titel AS Wer
  
events.start
  
kategorie1.titel AS Hauptkategorie
  
events.stop 
FROM 
 events 
 INNER JOIN daten ON 
(events.id_event=daten.id_event
 
INNER JOIN kategorie ON (cat.id_cat=daten.id_cat
 
INNER JOIN kategorie kategorie1 ON (kategorie1.id_cat=kategorie.subofcat
kriege ich schön alle daten - aber nur für kategorien die eine unterkategorie sind.

im beispiel würde mir das also folgendes ausgeben:
Code:
> hausmann - faulenzen - start1 - stop1
> freund - ausflug - start2 - stop2
nicht aber die anderen daten die ja noch vorhanden sind:
Code:
> irgendwer - faulenzen - start1 - stop1
> familienmitglieder - schlafen - start3 - stop3
soweit mein problem.

wenn ich mit dem query
PHP-Code:
SELECT  
events
.titel
kategorie.titel AS Wer
events.start
events.stop 
FROM 
events 
INNER JOIN daten ON 
(events.id_event=daten.id_event
INNER JOIN kategorie ON (kategorie.id_cat=daten.id_cat
alle daten ersuche erhalte ich diese zwar aber ohne die dazugehörigen hauptkategorien (wenn vorhanden)

im beispiel also:
Code:
> hausmann - faulenzen - start1 - stop1
> freund - ausflug - start2 - stop2
> irgendwer - faulenzen - start1 - stop1
> familienmitglieder - schlafen - start3 - stop3
und nicht wie gewünscht:
Code:
> hausmann - familienmitglieder - faulenzen - start1 - stop1
> freund - besucher - ausflug - start2 - stop2
> irgendwer - NULL - faulenzen - start1 - stop1
> familienmitglieder - NULL - schlafen - start3 - stop3
worum es bei der frage eigentlich geht:
wenn es mehrere events gibt für familienmitglieder oder freunde
und ich in einer abfrage alle events für den hausmann suche, dann möchte
ich auch die events für familienmitglieder gelistet haben...

kann mir da jemand helfen? mmh (das ganze sollte dann auch noch tiefer
gehen als nur eine ebene (also auch für einen markus noch funktionieren
[siehe beispiel oben]) - aber daran wage ich noch gar nicht zu denken )
oder gibt es eine andere lösung für mein problem? (anderer
tabellenaufbau usw... ) ich bin dankbar für alle anregungen!

gruss kendor

Geändert von kendor (04-09-2007 um 19:47 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 04-09-2007, 23:47
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

SELECT ... FROM kategorie LEFT JOIN events ON ...
Mit Zitat antworten
  #3 (permalink)  
Alt 05-09-2007, 14:31
kendor
 Newbie
Links : Onlinestatus : kendor ist offline
Registriert seit: Sep 2007
Beiträge: 11
kendor ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von onemorenerd
SELECT ... FROM kategorie LEFT JOIN events ON ...
wie soll ich das verstehen...

was ich weiter versucht habe ist folgendes:
Code:
SELECT 
 daten.id_event,
 daten.id_cat,
 events.titel AS WAS,
 cat.titel AS WER
FROM
 daten
 LEFT JOIN events ON (daten.id_event=events.id_event)
 LEFT JOIN cat ON (daten.id_cat IN (
     SELECT t1.id_cat AS lev1, t2.id_cat AS lev2, t3.id_cat as lev3
        from sch_cat as t1
        left join sch_cat as t2 on t2.`subofcat` = t1.`id_cat`
        left join sch_cat as t3 on t3.`subofcat` = t2.`id_cat`
        where t3.titel='Hausmann'
     )
 )
das subquery
Code:
(
     SELECT t1.id_cat AS lev1, t2.id_cat AS lev2, t3.id_cat as lev3
        from sch_cat as t1
        left join sch_cat as t2 on t2.`subofcat` = t1.`id_cat`
        left join sch_cat as t3 on t3.`subofcat` = t2.`id_cat`
        where t3.titel='Hausmann'
     )
gibt mir die parent ids des hausmanns an und für all die brauch ich ja auch die events.
aber ich krieg den fehler
Code:
SQL Error: Operand should contain 1 column(s)
was ja auch verständlich ist (das subquery gibt mehr als einen wert zurück)

hilfe! danke.... :S
Mit Zitat antworten
  #4 (permalink)  
Alt 06-09-2007, 06:14
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Bau es langsam auf, einen JOIN nach dem anderen. Wenn es irgendwann gar nicht mehr geht, solltest du dein Schema überdenken. Ich glaube beispielsweise Individuen (Hausmann) und Gruppen (Familienmitglieder) zu erkennen, alle in einer Relation ... nicht fertig normalisiert!
Mit Zitat antworten
  #5 (permalink)  
Alt 06-09-2007, 11:23
kendor
 Newbie
Links : Onlinestatus : kendor ist offline
Registriert seit: Sep 2007
Beiträge: 11
kendor ist zur Zeit noch ein unbeschriebenes Blatt
Standard

also - ich hab so viel zeit damit verbracht ein anständiges query zu finden wo man das direkt machen kann und es nicht geschafft, jetzt hab ich das ganze halt mit php gemacht:
PHP-Code:
    function list_category_events($id){
      if(
$id>0$more="WHERE sch_cat.id_cat=".$id;
        
$sql="SELECT 
              sch_daten.id_event,
              sch_daten.id_cat,
                sch_daten.ID,
                sch_cat.titel AS Wer,
                sch_events.titel AS Was
            FROM sch_events
             INNER JOIN sch_daten ON (sch_events.id_event=sch_daten.id_event)
             INNER JOIN sch_cat ON (sch_cat.id_cat=sch_daten.id_cat)"
.$more;
      
$result=query_database($sql);
      return 
$result;
    }
    
    function 
get_parent_of_id($id){
        
$result=query_database("SELECT subofcat AS parent FROM sch_cat WHERE id_cat=".$id." LIMIT 1");
        
$row=mysql_fetch_assoc($result);
        return 
$row['parent'];
    }
    
    function 
table_of_all_events_for_id($id=0){
        
$actual_id=$id;
        echo 
'<table width="98%">';
        echo  
'<tr>';
        echo    
'<td>ID</td>';
        echo    
'<td><strong>WER</strong> (ID)</td>';
        echo    
'<td><strong>WAS</strong> (ID)</td>';
        echo  
'</tr>';     
        
$num_results=0;
        while(
$actual_id!=NULL){
           
$result=list_category_events($actual_id);
           
$num_results+=mysql_num_rows($result);
           while(
$row=mysql_fetch_assoc($result)){
                echo  
'<tr>';
                echo    
'<td>'.$row['ID'].'</td>';
                echo    
'<td>'.$row['Wer'].' Parent:'.get_parent_of_id($row['id_cat']).'& ID'.$row['id_cat'].'</td>';
                echo    
'<td>'.$row['Was'].' ('.$row['id_event'].')</td>';
                echo  
'</tr>';                                  
            }
            echo 
"<tr><th colspan=\"3\"><hr></th></tr>";
            
$actual_id=get_parent_of_id($actual_id);
        }
        echo 
"</table>"
        echo 
'<p>Anzahl Events: '.$num_results.'</p>';
    } 
Mit Zitat antworten
  #6 (permalink)  
Alt 06-09-2007, 11:35
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ähm... einfach ein

PHP-Code:
SELECT  
  events
.titel
  
kategorie.titel AS Wer
  
events.start
  
kategorie1.titel AS Hauptkategorie
  
events.stop 
FROM 
 events 
 INNER JOIN daten ON 
(events.id_event=daten.id_event
 
INNER JOIN kategorie ON (cat.id_cat=daten.id_cat
 
LEFT JOIN kategorie kategorie1 ON (kategorie1.id_cat=kategorie.subofcat
Mit Zitat antworten
  #7 (permalink)  
Alt 06-09-2007, 11:54
kendor
 Newbie
Links : Onlinestatus : kendor ist offline
Registriert seit: Sep 2007
Beiträge: 11
kendor ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ähm nein - denn so kriege ich ja einfach nur die events / daten für alle resp. für eine bestimmte gruppe.

ich will ja aber auch die events der parents einer gruppe und die deren parents....

Haupgruppe1
-- Gruppe1.1
---- Untergruppe 1.1.1
-- Gruppe1.2
---- Untergruppe 1.2.2
---- Untergruppe 1.2.3
------ Unteruntergruppe 1.2.3.1
------ Unteruntergruppe 1.2.3.2
-- Gruppe1.3
Haupgruppe2
-- Gruppe2.1
---- Untergruppe 2.1.1
-- Gruppe2.2
---- Untergruppe 2.1.1
------ Unteruntergruppe 2.1.1.1


sagen wir ich will alle events die die mitglieder der hauptgruppe1 haben. dann kriege ich die einträge mit zugehörgkeit hauptgruppe1
oder die der untergruppe1.2.3 dann kriege ich die (mit deimem query)

für meine anwendung will ich aber jetzt die einträge der hruppe und deren parents...
also sage ich beispielsweise die events für unteruntergruppe 1.2.3.2. dann will ich alle einträge der:
- unteruntergruppe 1.2.3.2
- untergruppe 1.2.3
- gruppe 1.2
- hauptgruppe 1

alle events der hauptgruppe1 gelten auch für ihre childs. alle der gruppe2.2 auch für ihre childs usw...

und ich hab nicht rausgefunden wie man das mit sql direkt machen kann (da man ja die tiefe der struktur nicht kennt...? man müsste also immer alle daten der parentgruppe auslesen können bis der parent keinen parent mehr hat)

vielleicht hab ich mich in meinem ersten post schlecht ausgedrückt. danke für die hilfe.
Mit Zitat antworten
  #8 (permalink)  
Alt 06-09-2007, 11:59
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Was du demnach suchst ist wohl "nested set"~
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 00:19 Uhr.