Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
MySQL Abfrage - Rekursiv&Joins - ihr wissts bestimmt?! [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
brauche Webseite ideal für Vereine und Firmen
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
MySQL Abfrage - Rekursiv&Joins - ihr wissts bestimmt?!


 
kendor
04-09-2007, 19:44 
 
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:
1 - start1 - stop1- faulenzen
2 - start2 - stop2 - ausflug
3 - start3 - stop3 - schlafen

zeilen in kategorie:
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:
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:

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:

> hausmann - faulenzen - start1 - stop1
> freund - ausflug - start2 - stop2

nicht aber die anderen daten die ja noch vorhanden sind:

> irgendwer - faulenzen - start1 - stop1
> familienmitglieder - schlafen - start3 - stop3

soweit mein problem.

wenn ich mit dem query

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:
> hausmann - faulenzen - start1 - stop1
> freund - ausflug - start2 - stop2
> irgendwer - faulenzen - start1 - stop1
> familienmitglieder - schlafen - start3 - stop3

und nicht wie gewünscht:
> 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

 
onemorenerd
04-09-2007, 23:47 
 
SELECT ... FROM kategorie LEFT JOIN events ON ...

 
kendor
05-09-2007, 14:31 
 
Original geschrieben von onemorenerd
SELECT ... FROM kategorie LEFT JOIN events ON ... wie soll ich das verstehen...

was ich weiter versucht habe ist folgendes:

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 (
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 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

 
onemorenerd
06-09-2007, 06:14 
 
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!

 
kendor
06-09-2007, 11:23 
 
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:

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>';
}

 
ghostgambler
06-09-2007, 11:35 
 
ähm... einfach ein

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)
:confused:

 
kendor
06-09-2007, 11:54 
 
ä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.

 
ghostgambler
06-09-2007, 11:59 
 
Was du demnach suchst ist wohl "nested set"~

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 23:00 Uhr.